如何处理.htaccess规则中的&和/等特殊字符?

99t*_*run 2 php regex .htaccess mod-rewrite

在我的.htaccess文件中,我定义了以下规则,

RewriteRule ^([-0-9a-zA-Z]+) search.php?id=$1
Run Code Online (Sandbox Code Playgroud)

如果我正在浏览http://example.com/abcd,则上述规则可以正常工作, 我需要使用& % - /url中的符号,例如:http : //example.com/ab&cd

要使规则生效,必须进行哪些更改?

Jon*_*Lin 5

不知道该规则如何为您工作。首先,它循环。其次,没有针对$2和的捕获组$3,但这并不重要,因为$1无论如何总会“搜索”。我假设您粘贴了一条行之有效的规则的部分代码。

为什么究其原因&%/没有被匹配是因为你的正则表达式表示:

[-0-9a-zA-Z]+
Run Code Online (Sandbox Code Playgroud)

表示:一个或多个字母,数字或破折号。因此,没有&%/。因此,您可以将其添加到方括号中:

RewriteRule ^([-0-9a-zA-Z/%&]+) search.php?id=$1&ff=$2&ffid=$3
Run Code Online (Sandbox Code Playgroud)

但是,请记住,在应用任何规则之前都会对URI进行解码。这意味着如果URI看起来像:

/foo%28bar
Run Code Online (Sandbox Code Playgroud)

您不需要与匹配%,因为URI被解码为:

/foo(bar
Run Code Online (Sandbox Code Playgroud)

并且您需要与匹配(。更好的选择可能是只匹配之外的所有点:

RewriteRule ^([^.]+) search.php?id=$1&ff=$2&ffid=$3
Run Code Online (Sandbox Code Playgroud)

或您比赛中想要的任何东西。


尝试:

RewriteRule ^([^.]+)$ search.php?id=$1 [B]
Run Code Online (Sandbox Code Playgroud)

此处的区别是将$匹配项绑定到URI的末尾,并且B标志确保对&编码进行编码。