Apache:將所有 .html 和 .php 請求重定向到文件夾 + WordPress
重新啟動後,我有一堆指向帶有文件副檔名
.php
或.html
文件副檔名的 URL 的死反向連結。最好使用.htaccess
mod_rewrite 模組批量重定向它們。請求的重定向
.html
工作正常,但是,我無法讓.php
URL 的重定向工作。請注意,我使用 WordPress,因此必須有一個/wp-admin/
文件夾的豁免。到目前為止,這是我想出的,但它不適用於
.php
:# BEGIN WordPress <IfModule mod_rewrite.c> RewriteEngine On RewriteBase / # Redirect http requests to https RewriteCond %{SERVER_PORT} !=443 RewriteRule ^(.*)$ https://www.example.com/$1 [L] # Redirect html RewriteCond %{REQUEST_URI} \.html RewriteRule ^(.*)\.html$ /$1 [L] # Redirect php NOT WORKING RewriteCond %{REQUEST_URI} !^/wp-admin/ RewriteCond %{REQUEST_URI} \.php RewriteRule ^(.*)\.php$ /$1 [L] # Lines below come from WordPress RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule . /index.php [L] </IfModule> # END WordPress
你能看出我哪裡錯了嗎?還是我完全迷路了?
# Redirect html RewriteCond %{REQUEST_URI} \.html RewriteRule ^(.*)\.html$ /$1 [L]
這不是您似乎建議的“重定向”,如“外部 3xx 重定向”。如果您看到“重定向”,那麼要麼是其他東西正在這樣做,要麼您看到的是記憶體響應。上面的指令是內部重寫- 瀏覽器地址欄中的 URL 不會改變(這對 SEO不利)。
在這種情況下,該
RewriteCond
指令也是多餘的……它只是意味著您正在檢查.html
請求的 URL兩次。如果您想
.html
通過重定向刪除擴展,那麼您只需要以下內容:RewriteRule ^(.*)\.html$ /$1 [R,L]
但是,
.php
要從 URL 中刪除副檔名,您還需要避免重定向index.php
(WordPress 前端控制器會重寫),或者只確保您檢查的是初始請求,而不是重寫的請求。例如:# Redirect php (avoiding "/wp-admin/" and "/index.php") RewriteCond %{REQUEST_URI} !^/index.php$ RewriteCond %{REQUEST_URI} !^/wp-admin/ RewriteRule ^(.*)\.php$ /$1 [R,L]
為了確保您只測試初始請求而不是重寫請求,您可以使用如下條件:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
這只是檢查
REDIRECT_STATUS
環境變數是否為空 - 它在初始請求中。在第一次成功重寫後,它被設置為“200”(如 200 OK HTTP 狀態)。如果這是一個永久重定向,請更改為
R
,但只有在您確認它工作正常後才可以。R=301
您還應該避免將您自己的自定義指令添加到
# BEGIN WordPress
塊中,因為這些指令可能會被 WordPress 本身覆蓋。相反,這些指令應與您的 HTTP 到 HTTPS 重定向一起寫在塊之前(這# BEGIN WordPress
實際上也不是重定向*-您需要*在.R``RewriteRule