Apache-2.2

在不硬編碼主機名的情況下在 Apache 中強制使用 SSL

  • January 17, 2012

認為我已經對此進行了排序(主要感謝如何在不使用 .htaccess 硬編碼的情況下將非 www 重定向到 www 的問題?),但我仍然不完全理解一些事情。

我想強制所有非 SSL 連接到我的伺服器被路由到 SSL。我只有一個虛擬主機(並且在伺服器的整個生命週期內都將可靠地保持這種情況),但我想避免對域名進行硬編碼,部分原因是httpd.conf為了暫存和生產的文件保持相同。

mod_rewrite我知道我可以通過如下規則強制請求使用 SSL

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

或者

RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

不過,我有兩個相對簡單的問題:

  1. RewriteCond出於某種原因,我是否應該更喜歡其中一種陳述?大概如果我使用該%{SERVER_PORT}變數,那麼埠 8000 上的任何連接都會繼續以明文形式提供服務?有什麼原因我應該避免使用%{HTTPS}我忽略的變數嗎?
  2. %{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 提供)。

它甚至可能更快,因為要載入/執行的模組會少一個。

引用自:https://serverfault.com/questions/350372