如果没有尾部斜杠,则重写规则不起作用

时间:2012-02-27 20:39:08

标签: .htaccess loops rewrite


我有一个工作重写规则来隐藏URL中的index.php?dir =。例如,如果我尝试

www.example.com/folder/dir1/

它将其重写为

www.example.com/folder/index.php?dir=dir1/

那很好!

如果我从URL中删除了斜杠,那就麻烦了。

www.example.com/folder/dir1

进入重定向循环!

我的完成 htaccess是:

Options +FollowSymLinks 

RewriteEngine On
RewriteBase /folder

RewriteCond %{ENV:REDIRECT_STATUS} 200
RewriteRule .* - [L]

RewriteCond %{QUERY_STRING}  ^dir=(.*)$ [NC]
RewriteRule ^ %1? [L,R=301,NE]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} -d

RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]

请指教?

2 个答案:

答案 0 :(得分:1)

(i)我对RewriteBase /papers感到困惑。这只在DOCROOT/papers/.htaccess中有意义。如果这个位置并且是“文件夹”==论文?如果没有,那么重写引擎变得困惑并不奇怪。 (ii)如果MultiViews或DirectoryIndex匹配,`%{REDIRECT_STATUS}在子查询查找中不是200,以评估默认值。

所以在你做其他事之前:

  • 验证您的基础是否正确,如果没有修复它。
  • 如果您不使用,请使用Options -MultiViews
  • 检查您的系统,vhost配置和DOCROOT/.htaccess,看看是否指定了DirectoryIndex。 (与仅从最低.htaccess获取的重写规则不同,所有扫描规则都会扫描这些指令。)
  • RewriteCond %{ENV:REDIRECT_STATUS} 200替换为

     RewriteCond %{ENV:REDIRECT_END}%{IS_SUBREQ} true
    

    并将标志E=END:true添加到您希望强制结束循环的任何规则作为匹配(类似于Apache 2.4 [END]标志)额外的%{IS_SUBREQ}可防止规则被触发在子查询上。你不希望这种情况发生,除非你真的知道你在做什么。

答案 1 :(得分:0)

想出来了!

必须更换

RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]

RewriteRule ^(.*)? index.php?dir=$1/ [L,QSA]

感谢大家的贡献..