Mod rewrite apachecan';“不要重写”&&引用;作为URL中标记的一部分

Mod rewrite apachecan';“不要重写”&&引用;作为URL中标记的一部分,mod-rewrite,url-rewriting,Mod Rewrite,Url Rewriting,我有 与 我希望m&m在服务器端。(&已将URL编码到%26中) 出于某种原因,重写引擎将其视为 /tag/m%26m 就好像它是通过 /test.php?TAG=m&m var_dump($_GET)给出 但如果我访问 array(2) { ["TAG"]=> string(1) "m" ["m"]=> string(0) "" } 它工作正常,var_dump($_GET)提供 因此,问题一定与Apache重写引擎有关。如果它不是一个bug,那么

我有

我希望m&m在服务器端。(&已将URL编码到%26中)

出于某种原因,重写引擎将其视为

/tag/m%26m
就好像它是通过

/test.php?TAG=m&m
var_dump($_GET)给出

但如果我访问

array(2) {
    ["TAG"]=>  string(1) "m"
    ["m"]=>  string(0) ""
}
它工作正常,var_dump($_GET)提供

因此,问题一定与Apache重写引擎有关。如果它不是一个bug,那么配置重写规则使其工作的正确方法是什么

更多 我启用了重写日志并发现:

array(1) {
    ["TAG"]=> string(3) "m&m"
}
因此,看起来编码为%26的URL被解码回&。apache版本是2.4.6

您想要:


不要与NE(无转义)标志混淆,该标志防止使用特殊字符,如&和?以及#在重写的URL中进行URL编码。您可以在文档中阅读更多关于这些和其他方面的信息。

非常感谢。我查看了文档,意识到B标志是防止m%26m被转移到m&m的解决方案。NE标志适用于目标URL,B标志适用于源URL
array(2) {
    ["TAG"]=>  string(1) "m"
    ["m"]=>  string(0) ""
}
/test.php?TAG=m%26m
array(1) {
    ["TAG"]=> string(3) "m&m"
}
applying pattern '^tag/([^/]+)/?$' to uri 'tag/m&m'
RewriteRule ^tag/([^/]+)/?$ /test.php?TAG=$1 [L,B]