Apache-2.2
在不硬編碼主機名的情況下在 Apache 中強制使用 SSL
我認為我已經對此進行了排序(主要感謝如何在不使用 .htaccess 硬編碼的情況下將非 www 重定向到 www 的問題?),但我仍然不完全理解一些事情。
我想強制所有非 SSL 連接到我的伺服器被路由到 SSL。我只有一個虛擬主機(並且在伺服器的整個生命週期內都將可靠地保持這種情況),但我想避免對域名進行硬編碼,部分原因是
httpd.conf
為了暫存和生產的文件保持相同。
mod_rewrite
我知道我可以通過如下規則強制請求使用 SSLRewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
或者
RewriteCond %{SERVER_PORT} ^80$ RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
不過,我有兩個相對簡單的問題:
RewriteCond
出於某種原因,我是否應該更喜歡其中一種陳述?大概如果我使用該%{SERVER_PORT}
變數,那麼埠 8000 上的任何連接都會繼續以明文形式提供服務?有什麼原因我應該避免使用%{HTTPS}
我忽略的變數嗎?%{HTTP_HOST}
語句中的變數是否會RewriteRule
被尊重並自動替換Host:
為請求中的任何標頭?在某些情況下這可能不起作用嗎?以防萬一,我們在 RedHat 上執行 Apache 2,
mod_ssl
並且該站點使用 Drupal 7。抱歉,這是一個相對愚蠢的問題;Apache 系統管理員絕不是我工作的核心部分,所以我盡量應付過去。謝謝大家!
我一直使用類似以下的東西:
RewriteCond %{HTTPS} !=on RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
因為偶爾,我喜歡通過 80 以外的埠提供 HTTP。好吧,我不喜歡這樣做,但有時需要必須等
%{HTTPS}
,例如,如果 SSL 正在通過埠 80 使用。我想我通常使用
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
%{HTTP_HOST}
將始終是客戶端設置為Host:
標頭的任何內容。然而,我突然想到……還有另一種方法可以做到這一點。
<VirtualHost *:80> ServerName mysite.example.com Redirect permanent / https://mysite.example.com/ </VirtualHost>
您會注意到上面的塊中沒有 DocumentRoot。如果您要重定向所有內容,則不需要一個。
如果您只想將您的網站的一部分重定向到 SSL,您可以這樣做
Redirect permanent /secure https://mysite.example.com/secure
我認為 Redirect 選項對於全站點 HTTPS 強制更可取,因為它少了一級瘋狂(由 mod_rewrite 提供)。
它甚至可能更快,因為要載入/執行的模組會少一個。