我編寫以下.htaccess
規則將所有 URL 重定向www.a.com
到www.b.com
:
RewriteEngine on
RewriteCond %{http_host} ^www.a.com [NC,OR]
RewriteCond %{http_host} ^a.com [NC]
RewriteRule ^(.*)$ https://www.b.com/myfolder/ [R=301,NC,L]
現在 的子目錄下有一個文件a.com
,如下:
www.a.com/.well-known/acme-challenge/#######
它用於 AutoSSL 續訂。透過上述重定向,AutoSSL 將無法再找到該文件,因此更新失敗。
那麼,是否可以停用下面的重定向/.well-known/acme-challenge/
?
答案1
由於您將所有內容重新導向到固定的 URL 路徑,因此您也可以直接在指令中建立異常RewriteRule
(無需像目前那樣捕獲 URL 路徑)。
例如:
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
!
上的前綴RewriteRule
圖案否定表達式,因此當正規表示式執行時成功不是匹配。在這種情況下,當請求的 URL 路徑未開始時.well-known/acme-challenge/
。 (但是,請參閱下面的“邊緣情況”。)
我也結合了你的兩個狀況(RewriteCond
指令)合而為一。NC
規則本身不需要該標誌(假設您使用的是 Linux,而不是 Windows)。
請記住在正規表示式中反斜線轉義文字點。
邊緣盒(可選額外)
請注意,如果檔案後面還有前端控制器模式.htaccess
(例如 WordPress、Joomla、大多數其他框架/CMS 等),那麼您也應該添加狀態遵守上述規則,以防止在請求表單 URL 時重寫已重新導向的前端控制器/.well-known/acme-challenge/<non-existent-file>
。例如:
RewriteCond %{ENV:REDIRECT_STATUS} ^$
:
如果沒有這個條件,則請求http://a.com/.well-known/acme-challenge/<non-existent-file>
將被重新導向到https://www.b.com/index.php
(假設index.php
是前端控制器)。
概括
完整的規則將變為:
RewriteEngine On
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{HTTP_HOST} ^(www\.)?a\.com [NC]
RewriteRule !^\.well-known/acme-challenge/ https://www.b.com/myfolder/ [R=301,L]
# Front-controller pattern follows...
更新:
如果重定向是簡單的一行:
redirect 301 / https://www.b.com/myfolder/
,如何寫 的異常/.well-known/acme-challenge/
?
自從簡單的 Redirect
(mod_alias) 指令本身不提供建立「例外」的功能,您需要將指令包含在表達式中<If>
(需要 Apache 2.4)。例如:
<If "%{REQUEST_URI} !~ m#^/\.well-known/acme-challenge/#">
Redirect 301 / https://www.b.com/myfolder/
</If>
參考:https://httpd.apache.org/docs/2.4/expr.html
(如果您使用Redirect
這樣的指令,那麼就沒有“前端控制器”模式,也沒有上面提到的“邊緣情況”。)
在旁邊:雖然它們可能看起來相似,但該指令與先前使用的指令Redirect
有很大不同,並產生不同的結果。上述RewriteRule
指示RewriteRule
丟棄請求的 URL 路徑,將所有內容重新導向到https://www.b.com/myfolder/
.但是,Redirect
這裡使用的指令果醬請求的 URL 路徑,在 URL 路徑前添加前綴/myfolder
(例如,/foo/bar
重定向到https://www.b.com/myfolder/foo/bar
)