mod_rewrite:網頁有一個重新導向循環

mod_rewrite:網頁有一個重新導向循環

我試圖在主機名稱之後添加一個參數,如下所示:

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]

相關內容