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 則是變數,對應到 ^(.*)
- R: 一種Flag,代表Redirect
- 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 OnRewriteCond %{HTTPS} offRewriteCond %{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 時,就不會再導到伺服器去了。