RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\]*)?\HTTP/
除了以下部分,我理解上面一行中的所有内容:
([#?][^\]*)?\HTTP/
我做了一些研究,发现方括号用于匹配其中的任何一个字符。但是,我还了解到 ?
用于使前面的标记可选,而 ^
表示“匹配开始”。
因此,为什么上述段中的方括号中同时包含 ?
和 ^
?我认为方括号只是用作“字符类”。
另外,段中HTTP/
的具体用途是什么?我的所有搜索都无济于事。
最佳答案
首先了解什么是THE_REQUEST
。
THE_REQUEST
变量表示 Apache 从您的浏览器收到的原始请求,并且在执行某些重写规则后它不会被覆盖。此变量的示例值为:
GET /index.php?id=123 HTTP/1.1
现在您需要进一步说明的部分:
([#?][^\ ]*)?\ HTTP/
这是这里发生的事情:
- 它匹配
?
或#
字面意思,因为在[...]
中几乎所有特殊字符都按字面意思匹配 - 后跟一个否定的字符类,匹配除空格以外的任何字符的 0 个或多个字符
?
在([#?][^\]*)
之后使其成为可选匹配项\HTTP
匹配空格后跟HTTP
现在让我告诉你,这里不需要匹配的 #
,因为 Web 服务器永远不会收到 #
之后的 URL。这一切都由客户端浏览器处理。
最好使用这个RewriteCond
:
RewriteCond %{THE_REQUEST} ^(.+)\.php(\?\S*)?\ HTTP/ [NC]
关于regex - 了解 RewriteCond 中的 THE_REQUEST 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44993370/