.htaccess 名称中存在空格

Ryn*_*yne 3 regex apache .htaccess mod-rewrite url-rewriting

我正在开发一个用于.htaccess重定向www.example.com/Name到个人资料页面的项目。我让它在单个单词名称上运行良好。问题是,如果名称是“San Francisco”,无论我如何尝试,我都会得到 404。下面是我的.htaccess.

RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

我想知道如果我提供 URLwww.example.com/San_Francisco或类似的东西,我是否可以这样做。我阅读了一些与类似主题有关的其他问题,但从未找到可行的解决方案。

(似乎www.example.com/San%20Francisco是最好的,因为当我链接时,这当然是填充 URL 空间的内容)

MrW*_*ite 5

RewriteRule ^([A-Za-z0-9]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

您的RewriteRule 模式不包含空格,因此它永远不会与请求的 URL 中的空格匹配,例如。wwww.example.com/San%20Francisco%20是 URL 编码空间)。

请注意,虽然请求中的空格是 URL 编码(% 编码)(为了发出有效请求),但该RewriteRule 模式与 % 解码的 URL 路径匹配,即。一个文字空间。正则表达式中的文字空格必须用反斜杠转义(因为空格是 Apache 配置文件中的分隔符)。例如:

RewriteRule ^([A-Za-z0-9\ ]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

\s或者,您可以对任何空白字符使用简写字符类。有些人会认为这更容易阅读(因为你实际上无法“看到”空格):

RewriteRule ^([A-Za-z0-9\s]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

或者,您可以只使用非转义空格并将整个模式用双引号引起来:

RewriteRule "^([A-Za-z0-9 ]+)$" viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

请注意,上述模式允许在 URL 路径(配置文件名称)的开头和结尾处留有空格。显然,在首先创建配置文件名称时最好避免这些。

不用说, URL 中的空格是有问题的,最好从一开始就避免使用。对于“配置文件名称”,您最好创建一个仅在 URL 中使用的配置文件名称的单独“URL 版本”,例如 全部小写,将空格转换为连字符:/san-francisco


-要在模式中包含连字符 ( ),必须将连字符包含在字符类的开头或结尾(因为连字符在字符类中具有特殊含义)。例如:

RewriteRule ^([A-Za-z0-9\s-]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

要允许_在配置文件名称(URL 路径)中使用下划线 ( ),只需_在字符类中的任意位置添加:

RewriteRule ^([A-Za-z0-9_\s-]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

这与以下内容相同:

RewriteRule ^([\w\s-]+)$ viewProfile.php?Name=$1 [L]
Run Code Online (Sandbox Code Playgroud)

使用简写字符类\w来表示任何单词字符,即。[a-zA-Z0-9_]


更新:

如果当请求的 URL 路径中存在空格时,使用上述规则收到 403 Forbidden 响应,那么您需要添加标志B以在将反向引用应用于替换字符串之前显式转义反向引用。

例如:

RewriteRule ^([\w\s-]+)$ viewProfile.php?Name=$1 [B,L]
Run Code Online (Sandbox Code Playgroud)

这是 Apache 最近“安全”更新的结果,该更新现在拒绝查询字符串中未编码的特殊字符(过去它们是隐式编码的 - 所以不是问题)。有关详细信息,请参阅我对以下问题的回答: AH10411 错误:在 apache mod_rewrite 中管理空间和 %20