regex - 了解 RewriteCond 中的 THE_REQUEST 变量

标签 regex apache mod-rewrite

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

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

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

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

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

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

最佳答案

首先了解什么是THE_REQUEST

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

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

现在您需要进一步说明的部分:

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

这是这里发生的事情:

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

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

最好使用这个RewriteCond:

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

关于regex - 了解 RewriteCond 中的 THE_REQUEST 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993370/

相关文章:

php - 使用.htaccess重写动态子域

javascript - 正则表达式 - 有关字符之前和之后的空字符串的文档

java - Java/Android 中的正则表达式

Google Analytics 中访客与注册用户漏斗的正则表达式

php - 通过 PHP 发送浏览器 header

python - 我可以使用 mod_wsgi 使用 apache 部署 python 2 和 3 django 应用程序吗?

apache - 基于接受语言的重定向

regex - 如何在 R 中编写模式来表达 `don' t contain`?

php - Apache /PHP : Force execution of signed code only (or known MD5)

.htaccess - 使用 htaccess 规则阻止 Semalt 引荐来源网址