名称中的.htaccess空格

时间:2017-09-30 01:32:17

标签: .htaccess mod-rewrite

我正在开发一个使用.htaccesswww.example.com/Name重定向到个人资料页面的项目。我让它在单个单词名称上运行良好。问题是,如果名称是"旧金山"无论我尝试什么,我都会得到404。以下是我.htaccess中的一行。

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

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

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

1 个答案:

答案 0 :(得分:3)

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

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

请注意,虽然请求中的空间是URL编码(%编码)(为了发出有效请求),但RewriteRule 模式与%-decoded网址匹配 - 路径,即。文字空间。文字空间必须在正则表达式中反斜杠转义(因为空格是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路径(配置文件名称)的开头和结尾处添加空格。首先创建配置文件名称时,最好避免使用这些。

毋庸置疑, space 在网址中存在问题,最好从一开始就避免使用。对于"个人资料名称",您最好创建一个单独的" 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_]