很明显,从 apache 文档中,我看到了 NE 标志的以下描述: https ://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne
默认情况下,特殊字符(例如 & 和 ?)将被转换为等效的十六进制代码。使用 [NE] 标志可以防止这种情况发生。
RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]
上面的示例将 /anchor/xyz 重定向到 /bigpage.html#xyz。省略 [NE] 将导致 # 转换为其等效的十六进制代码 %23,这将导致 404 Not Found 错误条件。
但是,我已经看到了大量示例,您只需像这样放置 RewriteRule:
RewriteRule ^(.*)$ http://www.mydomain.com/?foo=bar&jee=lee [L,R]
如果您检查重定向后发送到服务器的最终请求,它只是相同的纯字符串,没有任何 uri 编码。如果我进行更多实验,如果源字符串在查询字符串部分中有一些特殊字符,那么 uri 编码似乎只发生在 mod_rewrite 内部,比如源是 originaldomain.com/?foo%5d=6
如果未提供 NE,mod_rewrite 将尝试通过将“%”编码为“%25”将其重写为 mydomain.com/?foo%255d=6。但请注意,如果我省略“?” 在我最初的请求中,编码不会发生。
所以这让我对大多数网站和文档中描述的内容感到困惑,除非我以完全错误的方式理解这个概念。
而且,我很想知道一般来说,浏览器和 mod_rewrite 用来决定是否要编码某些字符的经验法则是什么。在我看来,浏览器往往不会对任何内容进行编码,除非它发现发送在浏览器中输入的内容很难或没有意义,对吗?此外,如果有人可以提供一个完整的工作流程,说明从在浏览器中键入域到实际渲染页面的时间和地点,在整个过程中发生的所有编码和解码,那将是非常好的?