Apache HTTP服務器是世界上流行的Web服務器之一。這是一種開源跨平臺HTTP服務器,為互聯網上很大一部分的網站提供支持。Apache提供了許多強大的功能,可通過額外的模塊加以擴展。
如果你是一名網站所有者或系統管理員,很可能常與Apache打交道。你可能執行的最常見任務之一是將HTTP流量重定向至你網站的安全(HTTPS)版本。
不像HTTP以明文格式發送和返回請求和響應,HTTPS使用TLS/SSL來加密客戶端和服務器之間的通信內容。
使用HTTPS而不是HTTP有許多優點,比如:
- 所有數據都是雙向加密的。因而,敏感信息即使遭攔截也無法被讀取。
- 谷歌Chrome瀏覽器和所有其他流行的瀏覽器會將你的網站標為安全網站。
- HTTPS讓你可以使用HTTP/2協議,從而大大改善網站性能。
- 谷歌偏愛HTTPS網站。如果網站內容通過HTTPS來提供,你網站的排名會更高。
本文介紹了如何在Apache中將HTTP流量重定向至HTTPS。
在Apache中,有幾種方法可以重定向至HTTPS。如果你擁有訪問Apache在其中運行的linux服務器的root權限,首選方法是在域名的虛擬主機配置文件中設置重定向。否則,可以在域名的.htaccess文件中設置重定向。
一些控制面板(比如cPanel)讓你可以通過點擊幾下鼠標強制進行HTTPS重定向。
使用虛擬主機將HTTP重定向至HTTPS
Apache虛擬主機定義了服務器上托管的一個或多個域名的設置。在虛擬主機指令中,你可以指定網站文檔root(包含網站文件的那個目錄)、為每個網站創建單獨的安全策略、使用不同的SSL證書、配置重定向等等。
將SSL證書安裝到域名上時,通常會有針對該域名的兩個虛擬主機指令。第一個面向端口80的網站的HTTP版本,另一個面向端口443的HTTPS版本。
在基于Red Hat的發行版(比如centos和Fedora)中,虛擬主機文件存儲在/etc/httpd/conf.d中。在Debian及其衍生版本(比如Ubuntu)上時,文件存儲在/etc/apache2/sites-available目錄中。
要將網站重定向至HTTPS,使用Redirect指令,如下例所示:
- <VirtualHost *:80>
- ServerName example.com
- ServerAlias www.example.com
- Redirect permanent / https://example.com/
- </VirtualHost>
- <VirtualHost *:443>
- ServerName example.com
- ServerAlias www.example.com
- Protocols h2 http:/1.1
- # SSL Configuration
- # Other Apache Configuration
- </VirtualHost>
不妨解釋一下代碼。我們使用兩個虛擬主機指令,一個用于HTTP版本的網站,一個用于HTTPS版本的網站。
- VirtualHost *:80—Apache服務器在端口80(HTTP)上偵聽指定域名的入站連接。
- VirtualHost *:443—Apache服務器在端口443(HTTPS)上偵聽指定域名的入站連接。
ServerName和ServerAlias指令指定虛擬主機的域名。 確保將其換成你的域名。
HTTP虛擬主機中高亮的一行:Redirect permanent / https://example.com/將流量重定向至網站的HTTPS版本。
通常,你還希望將網站的HTTPS www版本重定向至非www,反之亦然。這是一個示例配置:
- <VirtualHost *:80>
- ServerName example.com
- ServerAlias www.example.com
- Redirect permanent / https://example.com/
- </VirtualHost>
- <VirtualHost *:443>
- ServerName example.com
- ServerAlias www.example.com
- Protocols h2 http:/1.1
- <If "%{HTTP_HOST} == 'www.example.com'">
- Redirect permanent / https://example.com/
- </If>
- # SSL Configuration
- # Other Apache Configuration
- </VirtualHost>
HTTPS虛擬主機內的代碼(高亮的那一行)檢查請求報頭是否含有www域名、重定向至非www版本。
每當你更改配置文件,都需要重新啟動或重新加載Apache服務,以使更改生效:
Debian和Ubuntu:
- sudo systemctl reload apache2
- CentOS和Fedora:
- sudo systemctl reload httpd
使用.htaccess將HTTP重定向至HTTPS
.htaccess是Apache Web服務器基于目錄的配置文件。該文件可用于定義Apache如何從文件所在的目錄中提供文件以及啟用/禁用其他功能。
.htaccess文件通常位于域名根目錄中,但你可以將其他.htaccess文件放在子目錄中。
該方法要求將mod_rewrite模塊加載到Apache服務器上。默認情況下,該模塊加載到大多數服務器上。可能的話,最好在虛擬主機中創建重定向,因為這更簡單更安全。
要將所有HTTP流量重定向至HTTPS,請打開root .htaccess文件,為它添加以下代碼:
- RewriteEngine On
- RewriteCond %{HTTPS} off
- RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
以下是代碼的含義:
- RewriteEngine On—啟用重寫功能。
- RewriteCond %{HTTPS} off—檢查HTTP連接,如果條件滿足,就執行下一行。
- RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]—將HTTP重定向至HTTPS,狀態代碼為301(永久移動)。確保更改了域名。
下面這個例子有一個額外的條件,檢查請求是否以www開始。用它迫使所有訪客使用網站的HTTPS非www版本:
- RewriteCond %{HTTPS} off [OR]
- RewriteCond %{HTTP_HOST} ^www.example.com [NC]
- RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
編輯.htaccess文件時,你不需要重啟服務器,因為Apache在每次請求時讀取文件。
結束語
在Apache中,將HTTP重定向至HTTPS的首選方法是在域名的虛擬主機中配置301 redirect。
原文標題:Redirect HTTP to HTTPS in Apache