Dot-Htaccess

我們可以使用 htaccess 為萬用字元重定向設置例外嗎?

  • December 7, 2019

我在我的一個舊站點中設置了萬用字元重定向,.htaccess它將所有請求重定向到新域上的同一頁面:

#Options +FollowSymLinks
RewriteEngine on
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

我想將舊域的首頁重定向到新域上的特定頁面。所以我在萬用字元重定向規則之上添加了這一行

#Options +FollowSymLinks
RewriteEngine on
Redirect 301 / https://example.com/specific-page/
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

但它不起作用。你能解釋一下我哪裡出錯了嗎?

我通過這個工具https://htaccess.madewithlove.be/對其進行了測試,它表明我的規則沒有問題。

Redirect(mod_alias) 和RewriteRule(mod_rewrite) 屬於不同的 Apache 模組,因此在請求期間在不同時間獨立執行。在 Apache 上,Redirect實際上在之後 RewriteRule執行,儘管配置文件中有明顯的順序。

因此,在您發布的指令中,RewriteRule重定向實際上是“獲勝”並重定向請求,因為它首先被處理。

Redirect 301 / https://example.com/specific-page/

mod_aliasRedirect指令也是前綴匹配的,因此/(單斜杠)之類的源 URL 實際上會匹配所有內容,而不僅僅是對文件根目錄(首頁)的請求。匹配後的所有內容都被複製到目標 URL 的末尾。所以上面的指令會重定向/<something>https://example.com/specific-page/<something>.

要將特定URL 重定向到不同的位置,您需要在更一般的重定向之前添加一個完全獨立的規則。

例如:

RewriteEngine on

# Redirect the document root (homepage) only
RewriteRule ^$ https://example.com/specific-page/ [R=301,L]

# Redirect everything else
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]

**更新:**請注意,^$(空字元串)/僅匹配請求的 URL 路徑(單斜杠)。在每個目錄的配置(即。.htaccess)中,RewriteRule匹配 URL 路徑減去斜杠前綴。(嚴格來說,它匹配 URL 路徑減去目錄前綴,即.htaccess文件本身的位置,並且總是以斜杠結尾。)

您需要在測試前清除瀏覽器記憶體。建議首先使用 302(臨時)重定向進行測試以避免記憶體問題。

#Options +FollowSymLinks

FollowSymLinksmod_rewrite 執行需要它,但這可能已經在您的伺服器配置中啟用。

我通過這個工具https://htaccess.madewithlove.be/對其進行了測試,它表明我的規則沒有問題。

該工具主要用於測試 mod_rewrite。在這種情況下,它弄錯了。

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