我一直在看mod_rewrite中的[NE]
(noescape)标志。经过一番思考,当我 NOT 想要使用该标志时,我无法弄清楚情况。这意味着,几乎每个RewriteRule
都启用标志似乎最有帮助。在某些情况下,不调用此标志会导致我出现问题。
我处理的大多数规则都是HTTP重定向([R]
),而不是通过。
当有人对mod_rewrite进行网址编码时,有人会对有所了解吗?
启用此标志通常是好的做法,还是使用允许mod_rewrite转义这些特殊字符的默认行为?为什么呢?
答案 0 :(得分:3)
如果查看source code for mod_rewrite,您会注意到如果启用了proxy-nocanon
,它会设置noescape
标记。
在revision where that line was first added中,它还包括此评论:
确保mod_proxy_http没有规范化URI,并在mod_proxy_http的文件名中保留任何(可能是qsappend'd)查询字符串:proxy_http_canon()
接下来,如果您阅读了mod_proxy documentation,您会看到以下提及的nocanon
:
通常,mod_proxy会规范化ProxyPassed网址。但这可能与某些后端不兼容,特别是那些使用PATH_INFO的后端。可选的nocanon关键字禁止此操作,并将URL路径“raw”传递给后端。请注意,这可能会影响后端的安全性,因为它会消除代理提供的针对基于URL的攻击的正常有限保护。
我可能会弄错,但这对我来说意味着在mod_proxy中使用nocanon
(在mod_rewrite中使用扩展名noescape
)会产生潜在的安全后果。这可以解释为什么它在默认情况下被禁用,甚至认为在大多数情况下启用它会更有用。
答案 1 :(得分:1)
当您添加请求网址时,[NE]
标记非常有用 - 例如 - 授权签名。
我刚才有一个错误,授权正在使用.htaccess关闭,但没有使用它。原来,原因是重定向是url编码最终在php $_GET
参数中的项目。为了解决我改变的错误:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/0-9])$ $1/ [R=301,L]
到
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*[^/0-9])$ $1/ [NE,R=301,L]
(授权签名由许多东西组成,其中一个是请求URL)