.htaccess 重写规则在没有尾部斜杠的情况下不起作用
.htaccess 重写规则在没有尾部斜杠的情况下不起作用,.htaccess,loops,rewrite,.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 它进入重定向循环我的完整访问权限是: Options +FollowSymLinks RewriteEngine On RewriteBase
我有一个有效的重写规则从URL中隐藏index.php?dir=。
例如,如果我尝试
www.example.com/folder/dir1/
它将其改写为
www.example.com/folder/index.php?dir=dir1/
那太好了问题是如果我从URL中删除了尾随斜杠,即
www.example.com/folder/dir1
它进入重定向循环我的完整访问权限是:
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]
请给出建议?(i)我对重写库/论文感到困惑。这只有在DOCROOT/papers/.htaccess
中才有意义。如果该位置为“文件夹”==纸张?如果不是这样的话,我对重写引擎变得混乱并不感到惊讶。(ii)在子查询查找中,`%{REDIRECT_STATUS}不是200,以在多视图或目录索引匹配时计算默认值
所以,在你做任何其他事情之前:
- 验证您的基础是否正确,如果不正确,请修复它
- 如果不使用选项-多视图,请使用它们
- 检查您的系统、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}防止对子查询触发规则。除非你真的知道自己在做什么,否则你不会希望这种事情发生
(i)我对
重写库/论文感到困惑。这只有在DOCROOT/papers/.htaccess
中才有意义。如果该位置为“文件夹”==纸张?如果不是这样的话,我对重写引擎变得混乱并不感到惊讶。(ii)在子查询查找中,`%{REDIRECT_STATUS}不是200,以在多视图或目录索引匹配时计算默认值
所以,在你做任何其他事情之前:
- 验证您的基础是否正确,如果不正确,请修复它
- 如果不使用选项-多视图,请使用它们
- 检查您的系统、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}防止对子查询触发规则。除非你真的知道自己在做什么,否则你不会希望这种事情发生
找到了答案
必须更换
RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]
与
感谢大家的贡献。找到了答案
必须更换
RewriteRule ^(.+)/? index.php?dir=$1 [L,QSA]
与
感谢大家的贡献。不确定,但请尝试更改RewriteRule^(+)/?index.php?dir=$1[L,QSA]
toRewriteRule^(+)?index.php?dir=$1[L,QSA]
你是说RewriteCond%{REQUEST\u FILENAME}-d
在上一条规则中?@Ofir:不,这没用!情况保持原样。@anubhava:不,没有它!故意..您可以尝试添加directorysash Off
不确定,但尝试更改RewriteRule^(+)/?index.php?dir=$1[L,QSA]
toRewriteRule^(+)?index.php?dir=$1[L,QSA]
你是说RewriteCond%{REQUEST\u FILENAME}-d
在上一条规则中?@Ofir:不,这没用!情况保持原样。@anubhava:不,没有它!故意..您可以尝试添加directorysash Off
regexp没有任何意义,因为^(.*)
意味着^(+)/?
和v.v。我也不确定您为什么要在dir参数上添加尾随/项。这也不能解释循环。我猜,'$1/'主要是让它工作的!我的PHP需要在目录末尾使用/才能工作。如果不存在,则名为index.php的目录会再次启动重定向。。它现在工作起来很有魅力。regexp没有任何意义,因为^(.*)
意味着^(+)/?
和v.v。我也不确定为什么要在dir参数上使用尾随/。这也不能解释循环。我猜,'$1/'主要是它工作的原因!我的PHP需要在目录末尾使用/才能工作。如果不存在,则名为index.php的目录会再次启动重定向。。它现在起作用了。。