Apache - 重写规则混淆

时间:2009-09-01 18:08:06

标签: apache mod-rewrite http-status-code-301

Redirect 301 /resort.php/FOO/BAR http://www.sitename.com.com/index.php
RewriteRule ^/direct/(.*) /direct/$1 [QSA,L] # access non i18n files directly
RewriteRule ^/([a-z]{2}\/.*)        /$1 [QSA,L] #any language subdirectory should be left alone
RewriteRule ^/(.*\/$)               /en/$1index.php [QSA,L] #fix for links ending in /
RewriteRule ^/(.*\.php)             /en/$1 [QSA,L]  #any php file with no language subdirectory redirects to the default language

为什么第一个重定向301没有进入主页的原因是什么?当我用..替换它时

RewriteRule ^/resort.php(.*) http://www.sitename.com/index.php [R=301,L]

它开始工作。我确定这是因为我有一堆规则而且它会跳到另一个但跳到另一个但我有点失落,也许一个大师可以更清楚地解释这个。

我的目录结构如下:

/en/index.php
/direct/

root中没有/index.php,我最初将它重定向到en。

2 个答案:

答案 0 :(得分:3)

Redirect指令正在与mod_rewrite进行一场战斗。后者非常具有攻击性,可能会通过Redirect指令覆盖响应上的重定向HTTP头集。

您已找到解决方案 - 使用RewriteRule执行重定向。 [L]标志表示“最后一条规则 - 不再处理”,这就是防止规则相互干扰的方式。普通Redirect指令只是实现RewriteRule更简单功能的简单方法。

答案 1 :(得分:0)

RewriteRule /resort.php/FOO/BAR http://www.sitename.com.com/index.php [R=P, L]

你的规则不会跳转,事实上,L标志意味着最后的规则,所以当一个触发时,文件就会停止被读取。