【问题标题】:Understanding an old .htaccess file了解旧的 .htaccess 文件
【发布时间】:2021-10-27 01:51:21
【问题描述】:

有人可以向我解释一下这个 RewriteCond 吗? 尤其是最后的 HTTP/ 部分:

RewriteEngine on
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /index\.php\ HTTP/
RewriteRule ^index\.php$ http://www.XXXXXXXXXXXXXXXX.com/ [R=301,L] 

我已经在here 找到了对前半部分条件的很好解释,但我仍然对“/index.php\ HTTP/”部分感到困惑。

再说一遍:为什么是“HTTP/”?

【问题讨论】:

    标签: .htaccess mod-rewrite


    【解决方案1】:

    我已经在这里找到了对前半部分条件的很好解释,但我仍然对“/index.php\ HTTP/”部分感到困惑。

    这种解释省略了一些细节。 THE_REQUEST 服务器变量包含 HTTP 请求标头的第一行。并且将包含以下形式的字符串:

    GET /index.php HTTP/1.1
    

    所以,它包含 3 条信息,用 空格 分隔。您有请求方法(GET、POST、OPTIONS、HEAD 等)、URI 和使用的协议/版本(本例中为 HTTP v1.1)。

    对于这个特定的正则表达式,您不一定需要包含最后的HTTP/ 部分,只需要包含 空格。但是,通过包含http/,它使正则表达式更易于阅读且不易出错。以 空格(你看不到)结束不是最佳做法。

    以下是等价的:

    RewriteCond %{THE_REQUEST} \s/index\.php\s
    

    这使用空格的简写字符类 (\s),而不是转义文字 空格(因此您可以“看到”空格)。

    或者,使用双引号将参数括起来:

    RewriteCond %{THE_REQUEST} " /index\.php "
    

    (尽管乍一看这几乎像是一个错误。)

    首先包含此条件RewriteCond 指令)的原因是为了防止在您稍后将请求重写为index.php 时出现重写循环(前端控制器模式) . THE_REQUEST 在由 Apache 内部重写时不会在整个请求中更新(与其他变量不同)。

    【讨论】:

    • 太棒了! “隐藏的空白”会让我困惑一段时间。谢谢!
    猜你喜欢
    • 2016-08-26
    • 2013-09-11
    • 2011-08-21
    • 2017-01-20
    • 2016-01-08
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多