.htaccess根據語言,我們在 WordPress 中有多個重定向。
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.es$
RewriteRule (.*)$ https://www.example.com/es/$1 [R=301,L]
RewriteCond %{HTTP_HOST} ^www.example.de$
RewriteRule (.*)$ https://www.example.com/de/$1 [R=301,L]
我們想排除一些檔案夾。我們已經嘗試添加這些示例:
RewriteCond %{REQUEST_URI} !^/folder/
但它不起作用。有誰知道該怎么做?
更新:我的完整.htaccess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.es$
RewriteCond %{REQUEST_URI} !^/folder/
RewriteRule (.*)$ https://www.example.com/es/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.fr$
RewriteRule (.*)$ https://www.example.com/fr/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.de$
RewriteRule (.*)$ https://www.example.com/de/$1 [R=301,L]
</IfModule>
# BEGIN WordPress
.....
uj5u.com熱心網友回復:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.es$
RewriteCond %{REQUEST_URI} !^/folder/
RewriteRule (.*)$ https://www.example.com/es/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.fr$
RewriteRule (.*)$ https://www.example.com/fr/$1 [R=301,L]
</IfModule>
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.example.de$
RewriteRule (.*)$ https://www.example.com/de/$1 [R=301,L]
</IfModule>
# BEGIN WordPress
.....
uj5u.com熱心網友回復:
RewriteCond %{REQUEST_URI} !^/folder/但它不起作用。
在這種情況下,簡單地向重定向規則添加一個條件將不起作用,因為......雖然重寫引擎在第一次傳遞時排除了“檔案夾”(URL 路徑),但 WordPress 代碼塊(稍后發生在該檔案)將請求重寫到index.php(WordPress 前端控制器),這會觸發重寫引擎的第二次傳遞(其中REQUEST_URI服務器變數已更新為/index.php)。然后重定向發生在第二遍,因為它不再匹配^/folder/。但是,重定向也是指向example.com/<lang>/index.php,而不是最初請求的 URL(您應該在瀏覽器的地址欄中看到)。
要解決此問題,您可以:
- 修改 WordPress 代碼塊,使其不會觸發第二次通過重寫引擎。例如。使用
END標志(需要 Apache 2.4 ),而不是L現有的重寫。但是,不建議這樣做,原因有兩個:- 您不應手動編輯
# BEGIN WordPress和# END WordPress注釋標記之間的代碼,因為 WP 本身管理此部分(至少它會嘗試這樣做,除非您對此進行了限制)。 - 您需要注意將來添加到
.htaccess檔案中的任何規則,以防止重寫回圈——這并不總是可能的。(有時“回圈”是可取的。)
- 您不應手動編輯
或,
- 確保您的重定向規則僅適用于初始請求,而不適用于重寫請求(重寫引擎的第二次傳遞)。您可以通過添加另一個檢查
REDIRECT_STATUS環境變數的條件來做到這一點,該環境變數在初始請求中為空。
我還假設您要重定向到的子目錄始終與所請求域的 TLD 匹配。您發布的示例中就是這種情況,但您尚未在評論中確認這一點。這意味著您只需要針對所有語言的一個規則,而不是針對每種語言的單獨規則。并且由于您已確認此檔案夾例外應適用于所有語言,因此只有一個規則是有意義的。
請嘗試以下方法(適用于所有語言):
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_URI} !^/folder/
RewriteCond %{HTTP_HOST} ^(www\.)?example\.([a-z]{2}).?$
RewriteRule (.*) https://www.example.com/%1/$1 [R=301,L]
%1反向參考(與 相對$1)包含在前面的CondPattern中匹配的TLD(2 字符語言代碼) 。IE。要么es,fr要么de。
如上所述,REDIRECT_STATUSenv var 確保重定向只發生在初始請求而不是重寫請求上。REDIRECT_STATUS在初始請求時為空,并在第一次成功重寫后設定為“200”(如 200 OK HTTP 回應狀態)(到 WordPress 前端控制器,即。/index.php)。
您不需要重復該RewriteEngine On指令,因為這已經在檔案中稍后發生。
您不需要<IfModule mod_rewrite.c>包裝器。(如果在多臺服務器上使用此代碼,我假設此代碼不是可選的?)
注意:首先使用 302(臨時)重定向進行測驗,以避免潛在的快取問題。您需要在測驗前清除瀏覽器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/505669.html
標籤:WordPress 阿帕奇 .htaccess 重定向 改写
上一篇:代替?用/在重寫規則中
下一篇:如果登錄成功,如何重定向?
