【问题标题】:RewriteCond REQUEST_URI not match whole pathRewriteCond REQUEST_URI 不匹配整个路径
【发布时间】:2020-04-05 02:46:46
【问题描述】:

我很困惑。

我的目标是检测是否需要重定向(路径已更改)。这是一个最小的例子。

RewriteRule ^first$ second

RewriteCond %{REQUEST_URI} !^/$1$
RewriteRule ^(.*)$ /$1 [R=301,L]

我请求example.com/first 是为了获得301 to second

问题是,RewriteCond 总是评估为 true 并创建一个循环。 第一次去,还好。但是在第二个请求(现在是 example.com/second)上,它再次评估为真,即使 %{REQUEST_URI}/second 并且 $1second。我知道是。我通过重定向到附加了两个变量的 URL 进行了检查。

知道我错过了什么吗?

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite server-variables


    【解决方案1】:

    请记住这里的两个重要事实:

    1. mod_rewrite 规则循环运行,只有在没有成功执行规则时才会停止
    2. %{REQUEST_URI} 的值在重写或重定向后发生变化。

    查看您的规则,您的第二个重定向规则是错误的,因为您不能在 RewriteCond 的值部分使用 %1$1,因此由于否定而使其始终返回 true。

    【讨论】:

    • 好吧,CondPattern 不能包含反向引用的事实是罪魁祸首。除此之外 %{REQUEST_URI} 仅在外部重定向时更改。如果您只是更改没有 [R] 标志的 url,则变量保持不变
    • REQUEST_URI 在没有R 的情况下也会发生变化。这就是在许多规则中使用THE_REQUST 来避免循环的原因。
    • 不确定在哪些情况下。我尝试了重写(没有外部重定向)和以下规则RewriteRule ^(.*)$ /p=$1&u=%{REQUEST_URI} [R=301,L],显示pu 不同。 p 是第一条规则的重写 url,u 是原始请求 url
    猜你喜欢
    • 2016-10-16
    • 2019-10-16
    • 2016-06-02
    • 2014-07-27
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 2018-09-11
    • 2017-03-23
    相关资源
    最近更新 更多