.htaccess 帶有斜杠的重定向 301 將斜杠添加到目標
剛剛重新完成了我的網站,並嘗試在 .htaccess 文件中為已更改的連結設置重定向
這很好用,但它不適用於
/example/
(源路徑上帶有斜杠)Redirect 301 /example /example.php
所以我添加了這個來解釋斜杠:
Redirect 301 /example/ /example.php
但這會重定向到
example.php/
(在目的地添加一個斜杠,這是行不通的)顯然我做錯了。有什麼更好的方法?
但這會重定向到
example.php/
這是由第一條(原始)規則引起的。請注意,較早的(錯誤的)301 可能已被瀏覽器記憶體。使用 302(臨時)重定向進行測試,以避免潛在的記憶體問題。
該
Redirect
指令是前綴匹配(整個路徑段),匹配後的所有內容都附加到目標 URL 的末尾。因此,第一個指令重定向:
/example
到/example.php
/example/
到/example.php/
和/example/abc
到/example.php/abc
如果指令是這樣排序的,那麼它們應該對發布的兩個範例 URL “起作用”:
Redirect 301 /example/ /example.php Redirect 301 /example /example.php
但是,該
Redirect
指令實際上並不是在這裡使用的正確指令,因為您需要兩個指令來處理它。(通常,使用該指令,您需要在源 URL 和目標 URL上包含Redirect
或排除尾部斜杠。)您可以改用該
RedirectMatch
指令,該指令使用正則表達式匹配。例如,處理帶有和不帶有斜杠的情況:RedirectMatch 301 ^/example/?$ /example.php
這僅匹配
/example
or/example/
並重定向到/example.php
。
Redirect
並且RedirectMatch
都是 mod_alias 的一部分。但是,如果您已經在使用 mod_rewrite,那麼請考慮使用 mod_rewrite
RewriteRule
來避免潛在的衝突,因為 mod_rewrite 總是在mod_alias之前.htaccess
執行,儘管. 例如:RewriteEngine On RewriteRule ^example/?$ /example.php [R=301,L]
請注意,在使用時
RewriteRule
模式上沒有斜杠前綴,.htaccess
因為模式匹配的 URL 路徑已刪除目錄前綴(始終以斜杠結尾)。另請注意,每個模組中指令的順序可能很重要。
*旁白:*如果您的網站“重新完成”,為什麼表單的“新”URL
/example.php
?這似乎是落後的?**更新:**我有人將原始的 wordpress 網站轉換為(幾乎)等效的網站,該網站僅使用 HTML 和一點 javascript 和 php
您可能會保留原始 WordPress URL(例如
/example
)並在內部將請求重寫為處理請求的基礎文件(即example.php
),而不是外部重定向. 為此,您需要使用 mod_rewrite。您還需要連結到 HTML 原始碼中的“舊”WordPress URL。例如。/example
(並考慮規範化尾部斜杠 - 重定向到一個或另一個)。要在內部重寫
/example
(或/example/
),/example.php
您只需R
從上述RewriteRule
指令中刪除標誌。例如:RewriteRule ^example/?$ example.php [L]
(我還刪除了
RewriteRule
替換上的斜杠前綴,現在不需要了,因為我們正在重寫文件系統路徑。)在您的 HTML 原始碼中提供連結,
/example
然後使用者不知道該請求確實映射到example.php
.