【问题标题】:Apache mod_rewrite REDIRECT_STATUS condition causing directory listingApache mod_rewrite REDIRECT_STATUS 条件导致目录列表
【发布时间】:2012-10-29 12:05:39
【问题描述】:

我有以下 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]

【问题讨论】:

  • 你有没有得到这个答案?
  • 其实不是 :( 还不错,只要它工作正常,我还是很想了解原因:)

标签: regex apache .htaccess mod-rewrite


【解决方案1】:

你有这个条件来停止循环:

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

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

【讨论】:

  • 它和我一开始的有什么不同?即:RewriteCond %{ENV:REDIRECT_STATUS} ^.
  • 查看您的条件RewriteCond %{ENV:REDIRECT_STATUS} ^. 将在%{ENV:REDIRECT_STATUS} 不为空时匹配,而不确保它为 200(成功)。
  • %{ENV:REDIRECT_STATUS}[R]ErrorDocument 得到什么值?
  • 所以得到错误码作为值,哈哈。但遗憾的是,重定向没有任何价值。
  • 是的,这个变量只有在内部重写发生时才会被填充。
猜你喜欢
  • 1970-01-01
  • 2013-07-12
  • 2012-12-17
  • 1970-01-01
  • 2019-07-28
  • 2011-05-30
  • 2013-01-13
  • 1970-01-01
  • 2012-03-25
相关资源
最近更新 更多