Apache 有條件地將 HTTP 重新導向到 HTTPS

Apache 有條件地將 HTTP 重新導向到 HTTPS

全部。我有文法問題。我嘗試過遵循其他來源,但它不起作用。

我已成功建立無條件 HTTP 到 HTTPS 重定向。去http://www.robjvargas.com,最終以 HTTPS 結束。那裡一切都很好。

但現在我的憑證似乎需要HTTP。它使用 Let's Encrypt,因此需要每 90 天更新一次。重定向生效後,試運轉會失敗。關閉重定向後,試運行就會成功。

所以我嘗試放入 RewriteCond 來免除憑證續約流量:

# HTTP to HTTPS redirect
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{Request_URI} !^./acme-challenge/*
RewriteRule (.*) https://www.robjvargas.com$1 [R,L]

只是它不起作用。我想我錯過了一些值得我一看到就拍額頭的東西,但我沒有看到它。透過上面的程式碼,HTTP 到 HTTPS 的重定向似乎仍然是通用的。因此,顯然 RewriteCond 是不正確的。 URI 之前的句點可能是錯誤的,但我已經嘗試過使用和不使用它。

我還將完整的 URI 放入 RewriteCond 中,但這也沒有免除它。

快到了。我沒有收到任何錯誤。它只是永遠不會滿足預期的條件。

我缺什麼?

答案1

但現在我的憑證似乎需要HTTP。

這不太正確。我個人透過 https 進行更新。但是,為了使其正常運作,您需要透過從 http VirtualHost 複製相關部分來確保允許存取 https VirtualHost 中的質詢 URI。如果您不能或不想這樣做,以下是如何使用您開始編寫的條件重定向使其通過 http 工作。

問題是您目前的正規表示式將與挑戰 URI 相符。根據阿帕奇文檔REQUEST_URI 以 / 開頭,因此您應該像這樣尋找挑戰 URI:^\/\.well-known\/.*$。這將匹配挑戰 URI (http://example.com/.well-known/acme-challenge)。

全部放在一起:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{REQUEST_URI} !^\/\.well-known\/.*$
RewriteRule (.*) https://www.robjvargas.com/$1 [R,L]

如果將來出現問題,請使用此:htaccess測試儀

答案2

在我的 Virtualmin 伺服器中,以下行就成功了。

RedirectMatch ^/(?!.well-known)(.*)$ https://phpmyadmin.example.com/$1

相關內容