我正在尝试使用紧跟在主机名后面的参数,如下所示:
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]