Apache mod_rewrite导致目录列表的REDIRECT_STATUS条件

时间:2012-10-29 12:05:40

标签: apache mod-rewrite

我有以下htaccess重写规则。 防止循环的一个规则条件最初以这种方式编写:

RewriteCond %{ENV:REDIRECT_STATUS} ^.

它曾经工作得很好,直到它突然停止工作,导致Apache显示网站的目录列表。

我必须将它更改为这个新表单,如下面的清单所示,让它再次起作用:

RewriteCond %{ENV:REDIRECT_STATUS} 200

您是否知道此行为的原因?

谢谢

RewriteEngine on
RewriteBase /

## Permanent 301

## Force to www. Un-comment in production.
RewriteCond %{HTTP_HOST} !^www\.myhost\.com [NC]
RewriteRule ^(.*) http://www.myhost.com/$1 [L,R=301]

## Permanent redirect rules for contents

RewriteRule ^argument/programming/?$ tags/programming [NC,L,R=301]

## Internal Redirect Loop Protection
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

## Maintenance page
#RewriteRule (.*) special/maintenance.html

## Specials
RewriteRule special/(.*) special/$1 [NC,L]

## Static resources
RewriteRule ^(.*\.(js|ico|gif|jpg|png|css|rss|xml|htm|html|pdf|zip|gz|txt))$ public/$1 [NC,L]

## Front Controller
RewriteRule ^(.*) public/index.php [NC,L]

1 个答案:

答案 0 :(得分:8)

你有这个条件停止循环:

## Internal Redirect Loop Protection
RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule ^ - [L]

这可以通过检查内部Apache变量%{ENV:REDIRECT_STATUS}来实现。此变量在重写模块开始时为空,但在第一次成功进行内部重写时设置为200。上述条件表示在首次成功重写后停止进一步重写并停止循环。