mod_rewrite NE标志 - 什么时候对URL中的特殊字符进行编码有帮助?

时间:2011-03-11 23:23:16

标签: .htaccess mod-rewrite url-rewriting url-encoding

我一直在看mod_rewrite中的[NE](noescape)标志。经过一番思考,当我 NOT 想要使用该标志时,我无法弄清楚情况。这意味着,几乎每个RewriteRule都启用标志似乎最有帮助。在某些情况下,不调用此标志会导致我出现问题。

我处理的大多数规则都是HTTP重定向([R]),而不是通过。

当有人对mod_rewrite进行网址编码时,有人会对有所了解吗?

启用此标志通常是好的做法,还是使用允许mod_rewrite转义这些特殊字符的默认行为?为什么呢?

2 个答案:

答案 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)