mod_rewrite:网页存在重定向循环

mod_rewrite:网页存在重定向循环

我正在尝试使用紧跟在主机名后面的参数,如下所示:

www.domain.com/参数

出于这个原因,我为想要操作的两个参数值设置了以下重写规则:

RewriteRule ^(en|pt)$ /index.php?language=$1&%{QUERY_STRING} [L]

效果很好!不过,我需要创建一个新规则,以重定向任何没有列出参数的请求。

因此,我认为这会起作用:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

但不幸的是,出现了重定向循环。

我已经得到了:

http://hostname/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt/pt//

任何关于如何解决此问题的提示都将不胜感激!

答案1

那是因为目录不是常规文件

http://httpd.apache.org/docs/current/mod/mod_rewrite.htmlid(代码片段没有 HTML DOM !最接近的是一个不相关的LA-U,甚至本应是一个的也 id="LA-F"丢失了!)

您可以执行各种文件属性测试:

'-d' (is directory)
Treats the TestString as a pathname and tests whether or not it exists, and is a directory.
'-f' (is regular file)
Treats the TestString as a pathname and tests whether or not it exists, and is a regular file.

假设您的其余配置是正确的(我不确定添加尾部斜杠是否是个好主意),您应该添加一个额外的条件!-d

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !^(en|pt)$
RewriteRule ^(.*)$ /pt/$1/ [L,R=301]

另外,考虑切换到 nginx!它不仅具有更清晰的语法,更适合常用用途,而且还具有相关文档的直接链接,例如--http://nginx.org/r/if

使用“-e”和“!-e”运算符检查文件、目录或符号链接的存在;

答案2

%{REQUEST_URI}是紧跟主机名的 URI 路径,因此以正斜杠开头:/

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(en|pt)$
RewriteRule ^.*$ /pt/$0/ [R=301,L]

相关内容