現場(環境):CetnOS 7.0 套件:apache (rewrite)
問題:
想要用virtualhost設定服務,
並且有將 IP連線強制導向網址 && 將所有連線導向https的需求。
處理方式:
從新版的Apache開始,
就已經將virtualhost這部份的移到conf.d去做處理了。
除了它之外,當然還有更多設定檔都已經被劃分出去。
將他變成模組化的設定方式。
主要就是讓所有的使用者不要再去修改httpd.conf這檔案了。
關於VirtualHost的部份。設定如下所示。
#vim /etc/http/conf.d/vhost.conf
NameVirtualHost *:80
<Directory "/home/prog/dm">
Options FollowSymLinks
AllowOverride All
Require all granted
</Directory>
<VirtualHost *:80>
ServerName www.dm.com
// 假設網域是www.dm.com
DocumentRoot /home/prog/dm
ErrorLog "|/usr/sbin/rotatelogs -l /home/prog/log/dm_error-%Y%m%d.log 86400"
CustomLog "|/usr/sbin/rotatelogs -l /home/prog/log/dm_access-%Y%m%d.log 86400" combined
</VirtualHost>
到這邊就算完成vhost.conf的設定檔。
設定轉址的部份。我們一樣可以在vhost裏面完成
<Directory "/home/prog/dm">
Options FollowSymLinks
AllowOverride All
Require all granted
RewriteEngine on
//假設網域是www.dm.com
RewriteCond %{HTTP_HOST} !^www\.dm\.com
RewriteRule ^(.*)$ http://www.dm.com/$1 [R=301,L]
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://www.dm.com/$1 [R=301,L]
</Directory>
這邊首要就是先將轉址功能啟動。
RewriteEngine on
再來就是設定條件,
RewriteCond 表示條件,RewriteRule表示為要執行什麼事情。
RewriteCond %{HTTP_HOST} !^www\.dm\.com
這一筆的意思是說如果,
使用者在瀏覽器上的網址列輸入非www\.dm\.com這個網址。
我們就將其引導到www\.dm\.com這個網址去。
RewriteRule ^(.*)$ http://www.dm.com/$1 [R=301,L]
再來的下一個條件,
因為我們的網站有加SSL憑證,
所以只要再網址那邊輸入非https然後是連到這台主機的。
RewriteCond %{HTTPS} !on
我全部都要幫他導向https://www.dm.com/
RewriteRule ^(.*)$ https://www.dm.com/$1 [R=301,L]
再來是小攻城師的戰場筆記有分享到一些好用的使用方法。
這邊是因為他有部份網站沒有要導到SSL下,
所以要在導入過去的ssl.conf那邊再做設定。
RewriteCond %{REQUEST_URI} ^.*/user_functions/.*$ [NC]
RewriteRule ".?" "-" [S=4]
S=X ; S表示為跳過多少下方的RewriteCond條件。
所以S=4表示為跳過下列四筆。
RewriteCond %{REQUEST_URI} \.js|\.css|\.(jpg|jpeg)|\.gif|\.png [NC]
RewriteRule ".?" "-" [S=3]
這邊的條件是用到網址的最後副檔名。
只要是這些(.js,.css … .png)結尾的網址,一樣不受下方規侷限制。
RewriteCond %{SERVER_PORT} ^443$ [OR]
RewriteCond %{HTTPS} on
RewriteCond %{REQUEST_URI} ^.*(?!\/reward\/).*$|(?!\.js)|(?!\.css) [NC]
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI} [L,R]
RewriteRule ^(.*)$ http://www.test.tw/$1 [R=301,L]
因為他要把部份不要導到https的網頁導回來。
%{HTTP_HOST} !^$ -使用者再瀏覽器請求的動作不是空值
[NC] - 表示不區分大小寫
[OR] -當作 AND 來看
[L] 表示這是最後一條改寫指令,
當符合者到這邊就停止。不再之後的規則比較。
[R=301] 網頁伺服器傳回一個301狀態碼給瀏覽器
也就是我們說的301轉址。
詳細的方法可以參考他的寫法,我覺得很實用。
相關網址付在參考頁面。
參考網頁:
<本篇完>