我有一个工作重写规则来隐藏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]
请指教?
答案 0 :(得分:1)
(i)我对RewriteBase /papers
感到困惑。这只在DOCROOT/papers/.htaccess
中有意义。如果这个位置并且是“文件夹”==论文?如果没有,那么重写引擎变得困惑并不奇怪。 (ii)如果MultiViews或DirectoryIndex匹配,`%{REDIRECT_STATUS}在子查询查找中不是200,以评估默认值。
所以在你做其他事之前:
Options -MultiViews
。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]
感谢大家的贡献..