我正在开发一个项目,该项目使用
.htaccess
将 www.example.com/Name
重定向到个人资料页面。我让它在单个单词名称上运行良好。问题是,如果名称是“San Francisco”,无论我尝试什么,我都会得到 404。下面是我的.htaccess
中的一行。
RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L]
我想知道如果我提供 URL
www.example.com/San_Francisco
或类似的东西,我是否可以这样做。我阅读了一些与类似主题有关的其他问题,但从未找到可行的解决方案。
(看起来
www.example.com/San%20Francisco
是最好的,因为当我链接时,它当然会填充 URL 空间)
RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L]
您的
RewriteRule
pattern 不包含 space,因此它永远不会与请求的 URL 中的空格匹配,例如。 wwww.example.com/San%20Francisco
(%20
是 URL 编码空间)。
请注意,尽管请求中的空格是 URL 编码(% 编码)(以便发出有效请求),但
RewriteRule
模式 与 % 解码的 URL 路径匹配,即。一个文字空间。正则表达式中的文字空格必须用反斜杠转义(因为空格是 Apache 配置文件中的分隔符)。例如:
RewriteRule ^([A-Za-z0-9\ ]+)$ viewProfile.php?Name=$1 [L]
或者,您可以对任何空白字符使用简写字符类
\s
。有些人会认为这更容易阅读(因为你实际上无法“看到”空格):
RewriteRule ^([A-Za-z0-9\s]+)$ viewProfile.php?Name=$1 [L]
或者,您可以只使用非转义空格并将整个模式用双引号引起来:
RewriteRule "^([A-Za-z0-9 ]+)$" viewProfile.php?Name=$1 [L]
请注意,上述模式允许在 URL 路径(配置文件名称)的开头和结尾处留有空格。显然,在首先创建配置文件名称时最好避免这些。
不用说,空格在 URL 中是有问题的,最好从一开始就避免。对于“配置文件名称”,您最好创建一个仅在 URL 中使用的配置文件名称的单独“URL 版本”,例如全部小写,将空格转换为连字符:
/san-francisco
要在模式中包含连字符 (
-
),它们必须包含在字符类的开头或结尾(因为连字符在字符类中具有特殊含义)。例如:
RewriteRule ^([A-Za-z0-9\s-]+)$ viewProfile.php?Name=$1 [L]
要在配置文件名称(URL 路径)中允许使用下划线 (
_
),只需在字符类中的任意位置添加 _
:
RewriteRule ^([A-Za-z0-9_\s-]+)$ viewProfile.php?Name=$1 [L]
等同于:
RewriteRule ^([\w\s-]+)$ viewProfile.php?Name=$1 [L]
使用简写字符类
\w
来表示任何单词字符,即。 [a-zA-Z0-9_]
。
更新:
如果当请求的 URL 路径中存在 spaces 时,您收到上述规则的 403 Forbidden 响应,那么您需要添加
B
标志以在将反向引用应用于 substitution 之前显式转义反向引用字符串。
例如:
RewriteRule ^([\w\s-]+)$ viewProfile.php?Name=$1 [B,L]
这是 Apache 最近“安全”更新的结果,该更新现在拒绝查询字符串中未编码的特殊字符(过去它们是隐式编码的 - 所以不是问题)。有关更多信息,请参阅我对以下问题的回答:AH10411错误:在apache mod_rewrite中管理空间和%20
感谢@MrWhite 涵盖包含空格的文件名的最新工作解决方案:
RewriteRule ^(.+)$ viewProfile.php?Name=$1 [B,L]