![mod_rewrite 除了两个文件之外的所有文件都导致循环](https://linux22.com/image/633961/mod_rewrite%20%E9%99%A4%E4%BA%86%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B9%8B%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E9%83%BD%E5%AF%BC%E8%87%B4%E5%BE%AA%E7%8E%AF.png)
我正在尝试设置一个网站,以允许创建信号量文件来关闭该网站。我想要遵循的逻辑是:
- 当信号文件存在时
- 并且请求不是针对 /style.css 或 /favicon.icon
- 显示/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 已消失状态代码发送给客户端,表明该网站已经消失并且不会再回来。