【问题标题】:Apache can't rewrite "&" as part of TAG in URLApache 无法将“&”重写为 URL 中 TAG 的一部分
【发布时间】:2016-03-11 00:31:04
【问题描述】:

我有

RewriteRule ^tag/([^/]+)/?$ /test.php?TAG=$1 [L]

/tag/m%26m

我希望 m&m 在服务器端。 ( & 被 URL 编码为 %26)

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

/test.php?TAG=m&m

好像它是用

访问的
/tag/m&m

var_dump($_GET) 给出

array(2) {
    ["TAG"]=>  string(1) "m"
    ["m"]=>  string(0) ""
}

但是如果我访问

/test.php?TAG=m%26m

它工作正常,并且 var_dump($_GET) 给出了

array(1) {
    ["TAG"]=> string(3) "m&m"
}

所以问题一定与 Apache 重写引擎有关。如果它不是错误,那么配置重写规则以使其工作的正确方法是什么?

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

applying pattern '^tag/([^/]+)/?$' to uri 'tag/m&m'

所以看起来像 %26 编码的 URL 被解码回 &。 apache版本是2.4.6

【问题讨论】:

    标签: mod-rewrite url-rewriting


    【解决方案1】:

    你想要B (escape backreferences) flag:

    RewriteRule ^tag/([^/]+)/?$ /test.php?TAG=$1 [L,B]
    

    不要与 NE(禁止转义)标志混淆,该标志可防止 & 和 ? 等特殊字符和 # 在重写的 URL 中被 urlencoded。您可以在文档中阅读有关这些和其他 mod_rewrite flags 的更多信息。

    【讨论】:

    • 非常感谢。我检查了文档,意识到 B 标志是防止 m%26m未转义m&m 的解决方案。 NE 标志适用于目标 URL,B 适用于源 URL
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 2013-06-09
    • 1970-01-01
    • 2013-03-06
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多