我們可以使用 htaccess 為萬用字元重定向設置例外嗎?
我在我的一個舊站點中設置了萬用字元重定向,
.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_alias
Redirect
指令也是前綴匹配的,因此/
(單斜杠)之類的源 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
FollowSymLinks
mod_rewrite 執行需要它,但這可能已經在您的伺服器配置中啟用。我通過這個工具https://htaccess.madewithlove.be/對其進行了測試,它表明我的規則沒有問題。
該工具主要用於測試 mod_rewrite。在這種情況下,它弄錯了。