如何停用特定資料夾的 .htaccess 重新導向

如何停用特定資料夾的 .htaccess 重新導向

我編寫以下.htaccess規則將所有 URL 重定向www.a.comwww.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

相關內容