我試圖在主機名稱之後添加一個參數,如下所示:
www.domain.com/parameter
因此,我為我想要操作的兩個參數值設定了以下 rewriteRule:
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
,甚至本應是 an 的內容也 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]