.htaccess . ht访问名称中的空格

fhity93d  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(119)

我正在做一个使用.htaccess重定向www.example.com/Name到个人资料页面的项目。我可以很好地处理单个单词名称。问题是,如果名称是“San弗朗西斯科”,无论我尝试什么,都会得到404。下面是我的.htaccess中的行。

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

我想知道是否有什么东西,我可以这样做,如果我给予的网址www.example.com/San_Francisco或类似的东西,它会工作.我读了一些其他的问题,有一个类似的主题,但从来没有得到一个工作的解决方案.
(看起来www.example.com/San%20Francisco是最好的,因为当我链接时,它当然是填充URL空间的内容)

64jmpszr

64jmpszr1#

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

您的RewriteRule * 模式 * 不包含 * 空格 *,因此它永远不会匹配所请求的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_]

相关问题