.htaccess - 通过 URL 重写防止无限循环

.htaccess - preventing infinite loops with URL rewriting

我有一个包含以下内容的 .htaccess :

<Files .htaccess>
order allow,deny
deny from all
</Files>

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{REQUEST_URI} !^(.*)/maintenance/(.*)$ [NC]

RewriteRule ^(.*).jpg$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteRule ^(.*).jpeg$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteRule ^(.*).gif$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteRule ^(.*).png$ /mysite/maintenance/transparent.png [NC,R=302,L]

RewriteRule ^(.*).php$ /mysite/maintenance/maintenance.php [NC,R=302,L]

在本地主机上测试。

使用这些设置,我在尝试加载时出现无限循环 http://localhost/mysite/test.php, (correctly) redirected to http://localhost/mysite/maintenance/maintenance.php

循环似乎是由于 4 图片重定向造成的(注意:维护页面有一个独特的 jpg 背景图片位于维护文件夹根目录中)。注释这 4 条重定向行可以解决问题。

但我不明白为什么我会进入无限循环,因为 /maintenance/ 路径本身被排除在 RewriteCond 的重定向之外,以及为什么图像上的重定向会干扰这个问题。

你能帮忙吗?

您必须像这样重新订购您的 RewriteConds

RewriteEngine On

RewriteRule \.jpg$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteRule \.jpeg$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteRule \.gif$ /mysite/maintenance/transparent.png [NC,R=302,L]
RewriteCond %{REQUEST_URI} !^.*/maintenance/.*$ [NC]
RewriteRule \.png$ /mysite/maintenance/transparent.png [NC,R=302,L]

RewriteCond %{REQUEST_URI} !^.*/maintenance/.*$ [NC]
RewriteRule \.php$ /mysite/maintenance/maintenance.php [NC,R=302,L]

RewriteCond 指令仅影响其后的第一个 RewriteRule

我知道这个问题的答案已被接受,但这里有一个更短的方法可以使用:

RewriteEngine On

RewriteRule \.(jpe?g|gif)$ /mysite/maintenance/transparent.png [NC,R=302,L]

RewriteCond %{REQUEST_URI} !/maintenance/ [NC]
RewriteRule \.(png|php)$ /mysite/maintenance/transparent. [NC,R=302,L]