【问题标题】:mod_rewrite does not encode special characters even if NE flag is not supplied?即使未提供 NE 标志,mod_rewrite 也不编码特殊字符?
【发布时间】:2013-06-10 15:54:41
【问题描述】:

很明显,从 apache 文档中,我看到了 NE 标志的以下描述: https://httpd.apache.org/docs/2.2/rewrite/flags.html#flag_ne

默认情况下,特殊字符(例如 & 和 ?)将被转换为对应的十六进制代码。使用 [NE] 标志可以防止这种情况发生。

重写规则 ^/anchor/(.+) /bigpage.html#$1 [NE,R]

上面的例子会将 /anchor/xyz 重定向到 /bigpage.html#xyz。省略 [NE] 将导致 # 转换为其等效的十六进制代码 %23,这将导致 404 Not Found 错误条件。

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

【问题讨论】:

    标签: apache mod-rewrite url-encoding


    【解决方案1】:

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

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

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

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

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

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

    同样根据 RFC:

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

    另外来自第 1.2.3 节

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

    【讨论】:

      猜你喜欢
      • 2011-07-13
      • 2015-10-07
      • 2012-03-22
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多