.htaccess 名称中的空格

问题描述 投票:0回答:2

我正在开发一个项目,该项目使用

.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 空间)

regex apache .htaccess mod-rewrite url-rewriting
2个回答
7
投票
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


0
投票

感谢@MrWhite 涵盖包含空格的文件名的最新工作解决方案:

RewriteRule ^(.+)$ viewProfile.php?Name=$1 [B,L]
© www.soinside.com 2019 - 2024. All rights reserved.