【Linux】【Apache】http重新導向https

Apache設定檔


環境:Ubuntu 16.04 、Apache 2.4.18


Ubuntu 的Apache 中並沒有 httpd.conf 這個設定檔,
httpd.conf 通常指的就是在 /etc/apache2 底下的設定檔。

若要修改Apache 的設定,
在 /etc/apache2/sites-available 資料夾底下有兩個設定檔,分別是:
000-default.conf:http 的設定檔案
default-ssl.conf:https 的設定檔案

經由這兩個檔案來協助,
通常不會直接去動 /etc/apache2/apache2.conf




/etc/apache2/sites-enabled 底下也有一模一樣的
000-default.conf、default-ssl.conf 這兩個檔案,
差別在於 sites-available 是我們可以修改的,
而sites-enabled 是Apache正在運行的設定
所以當sites-available修改完後要去 reload 設定、restart服務。


$ sudo vim /etc/apache2/sites-available/000-default.conf
(/etc/apache2/sites-available/000-default.conf)
<VirtualHost *:80>
    ServerName www.gjlmotea.com
    ServerAdmin gjlmotea@gmail.com
    DocumentRoot /var/www
</VirtualHost>
<Directory /var/www>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

備註:若在Xampp底下則設定檔路徑為 C:\xampp\apache\conf\httpd.conf

.htaccess檔案



htaccess 全名為 Hypertext Access,
.htaccess 檔案裡寫的是對於網站、目錄訪問的規則及設定,
影響範圍為.htaccess所在資料夾的 底下所有的子目錄,
(所以可以按需求在多個資料夾設 .htaccess檔)

而加入 AllowOverride All 這一行的意思是,
當資料夾底下有.htaccess的檔案時,將以.htaccess的設定為準。

若要Apache忽略所有的.htaccess設定則為 AllowOverride None
(/var/www)
$ vim .htaccess
沒有.htaccess的話則創建一個
(/var/www/.htaccess)
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://www.gjlmotea.com/$1 [R,L]
RewriteRule 中的

  1. ^(.*) 表示所有 域名後的資料
  2. $1 則是變數,對應到 ^(.*)
  3. R: 一種Flag,代表Redirect
  4. L: 一種Flag,作為匹配的結束標誌
意即:
所有的 http://www.gjlmotea.com/...,都會被重導向到 https://www.gjlmotea.com/...



以上兩個文件修改之後,
連到自己網站時,卻又一直出現 Internal Server Error 的錯誤。

$ sudo a2enmod rewrite

$ sudo apache2 restart


最後重啟服務之後就沒問題了,
不論在網址欄直接輸入IP、或是http,都會被導回https。




2022.02 更新:


發現上面的 .htaccess 寫法比較不好,
當然還是可以運作,但會導致以下狀況:

因為個人在開發時會一併將 .htaccess 推上git,在伺服器上再從遠端pull下來
於是發生在本地開發、測試時,在網址列上輸入 127.0.0.1/gjlmotea 卻因為 .htaccess 的關係,就真的導向到 https://gjlmotea.com,但我只是想看本地端的修改,造成開發時的不便。

於是現在要來區分這兩者:
絕對路徑: https://gjlmotea.com 
相對路徑: 127.0.0.1/gjlmotea


(.htaccess)

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_HOST} !^localhost [NC]
RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

這幾行所做如下:

RewriteCond %{HTTPS} off
當非HTTPS時 

RewriteCond %{HTTP_HOST} !^localhost [NC] 
!代表not、^代表開頭、[NC]代表No Case 表示不區分大小寫
當不是由localhost字串開頭時 

RewriteCond %{REMOTE_ADDR} !^127\.0\.0\.1$
代表127.0.0.1、127.1.1.1 等之類的自身地址出發

當以上條件都達到時,
才會做重導向到 {HTTP_HOST}%{REQUEST_URI} 的位置


這樣一來,在本地網址列上輸入 127.0.0.1/gjlmotea 時,就不會再導到伺服器去了。