【问题标题】:Understanding THE_REQUEST variable in RewriteCond了解 RewriteCond 中的 THE_REQUEST 变量
【发布时间】:2017-07-09 05:42:14
【问题描述】:

RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/

我了解上面一行中的所有内容,但以下部分除外:

([#?][^\ ]*)?\ HTTP/

我做了一些研究,发现方括号用于匹配其中的任何一个字符。但是,我也了解到? 用于使前面的标记可选,^ 表示“匹配开始”。

因此,为什么上面段中的方括号同时包含?^?我以为方括号只是用作“字符类”。

另外,HTTP/ 在段中的具体用途是什么?我所有的搜索都无济于事。

【问题讨论】:

    标签: regex apache mod-rewrite


    【解决方案1】:

    首先了解THE_REQUEST是什么。

    THE_REQUEST 变量表示 Apache 从您的浏览器收到的原始请求,并且在执行某些重写规则后它不会被覆盖。此变量的示例值为:

    GET /index.php?id=123 HTTP/1.1
    

    现在你想进一步澄清的部分:

    ([#?][^\ ]*)?\ HTTP/
    

    这是这里发生的事情:

    1. 它匹配?# 字面意思,因为在[...] 中几乎所有特殊字符都字面意思匹配
    2. 后跟一个否定字符类,它匹配除空格以外的任何字符的 0 个或多个字符
    3. ?([#?][^\ ]*) 之后使其成为可选匹配
    4. \ HTTP 匹配一个空格,后跟 HTTP

    现在让我告诉你,这里不需要匹配 #,因为网络服务器在 # 之后永远不会收到 URL。这一切都由客户端浏览器处理。

    最好用这个RewriteCond:

    RewriteCond %{THE_REQUEST} ^(.+)\.php(\?\S*)?\ HTTP/ [NC]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-25
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多