Dot-Htaccess

.htaccess 帶有斜杠的重定向 301 將斜杠添加到目標

  • October 12, 2020

剛剛重新完成了我的網站,並嘗試在 .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

這僅匹配/exampleor/example/並重定向到/example.php

Redirect並且RedirectMatch都是 mod_alias 的一部分。

但是,如果您已經在使用 mod_rewrite,那麼請考慮使用 mod_rewriteRewriteRule來避免潛在的衝突,因為 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.

引用自:https://serverfault.com/questions/1037305