mod_rewrite 除了两个文件之外的所有文件都导致循环

mod_rewrite 除了两个文件之外的所有文件都导致循环

我正在尝试设置一个网站,以允许创建信号量文件来关闭该网站。我想要遵循的逻辑是:

  1. 当信号文件存在时
  2. 并且请求不是针对 /style.css 或 /favicon.icon
  3. 显示/closed.html 的内容

1 和 3 都可以正常工作,但是当请求 style.css 或 favicon.ico 时,2 的异常会导致处理循环。这是我最近的尝试:

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

这是在 VirtualHost 块中,而不是在目录中。没有 .htaccess 文件在起作用。

我最近也尝试过这个,基于我在其他地方找到的答案,但结果相同(循环):

RewriteCond %{REQUEST_URI} ^/style.css [OR]
RewriteCond %{REQUEST_URI} ^/favicon.ico
RewriteRule ^.*$ - [L]
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

我预计 /style.css 或 /favicon.ico 的请求无法满足前两个重写条件之一,这应该会阻止 URI 被重写,从而停止 mod_rewrite 迭代。但是,mod_rewrite 似乎认为 URI 在这些情况下已被重写,并再次迭代规则(一次又一次)。除了 style.css 或 favicon.ico 之外,上述方法在所有情况下都能正常工作。在这些情况下,我超出了循环限制。

当有人请求 style.css 或 favicon.ico 时,我遗漏了什么导致重写迭代停止?

编辑:以下是使用第一个规则集时,当 /style.css 收到请求时发生的情况的日志级别 9 示例。这只是前两次迭代……它会继续以相同的方式循环,直到达到限制。

2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (2) init rewrite engine with requested uri /style.css
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (3) applying pattern '^.*$' to uri '/style.css'
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (4) RewriteCond: input='/style.css' pattern='!^/style.css' => not-matched
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1db0a0/initial] (1) pass through /style.css  
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (2) init rewrite engine with requested uri /style.css
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (3) applying pattern '^.*$' to uri '/style.css'
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (4) RewriteCond: input='/style.css' pattern='!^/style.css' => not-matched
2001:4900:1044:0:145f:826e:6436:dc1 - - [29/May/2014:15:29:26 +0000] [host.example/sid#80c1c48b0][rid#80c1dd0a0/initial] (1) pass through /style.css

答案1

尝试添加

RewriteLog /tmp/rewrite.log
RewriteLogLevel 4

查看日志文件是否有帮助。

答案2

/closed.html是造成这种无限循环的原因。

我认为这可能会解决您的问题。我只是在您的第一次尝试中添加了一行(参见第 4 行):

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond %{REQUEST_URI} !^/closed.html
RewriteCond /usr/local/etc/site/closed -f
RewriteRule ^.*$ /closed.html [L]

答案3

我在最新的 CentOS 6 上的 Apache 设置中尝试了您的设置。

这是我的配置

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/style.css
RewriteCond %{REQUEST_URI} !^/favicon.ico
RewriteCond /tmp/closed -F
RewriteRule ^.*$ /closed.html [L]

以下是证明其有效的日志:

$ curl https://localhost/
<!DOCTYPE html>
<title>It works!</title>
<p>It works!</p>

$ curl https://localhost/style.css
html {
background: black;
color: white;
}

$ touch /tmp/closed
$ curl https://localhost/
<!DOCTYPE html>
<title>We're closed</title>
<p>We're closed</p>

$ curl https://localhost/style.css
html {
background: black;
color: white;
}

编辑这不是您想要的问题,我将其留在这里,以便可以帮助其他有类似问题的人。

解决问题的另一种方法是这样的

<LocationMatch "^/(?!410\.html)">
    RedirectMatch gone .*
</LocationMatch>
ErrorDocument 410 /410.html

您的错误页面在哪里410.html。这将发送410 已消失状态代码发送给客户端,表明该网站已经消失并且不会再回来。

相关内容