我正在开发一个使用.htaccess
将www.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空间的时候)
答案 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_]
。