1

很明显,从 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 用来决定是否要编码某些字符的经验法则是什么。在我看来,浏览器往往不会对任何内容进行编码,除非它发现发送在浏览器中输入的内容很难或没有意义,对吗?此外,如果有人可以提供一个完整的工作流程,说明从在浏览器中键入域到实际渲染页面的时间和地点,在整个过程中发生的所有编码和解码,那将是非常好的?

4

1 回答 1

1

关于 URI的一般“经验法则”“关于所有编码和解码发生的时间和地点的完整工作流程”可以在RFC3986中找到:

通用语法使用斜杠 ("/")、问号 ("?") 和
数字符号 ("#") 字符来分隔
对通用解析器对标识符的分层解释很重要的组件。

简而言之,#大多数浏览器使用的符号被认为是相对引用。例如,您可以id在页面上添加一个链接:

http://www.example.com/mypage.html#some_div_id

因此,Apache 并不期望这会出现在服务器端。因此,默认情况下,它是 url 编码(他们的术语是转义的)hash符号,以便在您进行重写时将其向前传递。(它试图根据 RFC 保护您免受自己的伤害。)

or noescape 标志基本上阻止了默认 url 编码的[NE]发生。

同样根据 RFC:

2.2.
保留字符 URI 包括由“保留”集中的字符分隔的组件和子组件。这些字符被称为
“保留”,因为它们可能(或可能不)被
通用语法、每个特定于方案的语法或
URI 的解引用算法的特定于实现的语法定义为分隔符。
如果 URI 组件的数据与保留
字符作为分隔符的用途发生冲突,则必须在形成 URI 之前对冲突数据进行百分比编码。

另外来自第 1.2.3 节

由于相对引用只能在分层 URI 的上下文中使用,新 URI 方案的设计者应该使用与通用语法的分层组件一致的语法,除非有令人信服的理由禁止在该方案中进行相对引用。

于 2013-06-14T05:21:35.327 回答