了解RewriteCond中的THE_REQUEST变量

时间:2017-07-09 05:42:14

标签: regex mod-rewrite

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

我理解上面一行中的所有内容,但以下段除外:

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

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

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

此外,细分中HTTP/的具体目的是什么?我的所有搜索都无济于事。

1 个答案:

答案 0 :(得分:2)

首先了解什么是POST

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

THE_REQUEST

现在你需要更多澄清的部分:

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

以下是这里发生的事情:

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

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

    最好使用此#

    RewriteCond