為什麼這篇apache http轉https鄉民發文收入到精華區:因為在apache http轉https這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者weiclin (CC)標題Re: [請益] apache隱藏副檔名及http轉https時間F...
※ 引述《Moon008 (008)》之銘言:
: 各位前輩好,
: 最近在測試用Apache架站,希望可以將網頁的副檔名隱藏起來,並且強制使用https連線
: 假設目前網頁有:
: index.php
: about.html
: contact.php
: 我希望呈現的是:
: https://domain.com/ (index.php)
: https://domain.com/about (about.html)
: https://domain.com/contact (contact.php)
: 在使用https之前,我是使用.htacess的方式,放在根目錄下,設定為:
: RewriteEngine on
: RewriteBase /
: RewriteRule ^([A-Za-z0-9_-]+)$ $1.html
: 可是這樣子沒辦法辨識該網頁應該是.php還是.html
: 不知道有沒有辦法同時適用?
: 另外就是因為目前希望全站都透過https連線,
: 可是我將上方的規則修改如下之後:
: RewriteEngine on
: RewriteBase /
: RewriteCond %{SERVER_PORT} !443
: RewriteRule ^([A-Za-z0-9_-]+)$ https://%{SERVER_NAME}/$1.html
: 一來是我如果直接輸入:domain.com連入,會預設以http連線,
: 且我再點網頁上的連結到別頁(例如href="about")
: 卻會把副檔名也加上去(變成https://domain.com/about.html)
: 不知道我的需求使用Rewrite是否可以完全達到呢?
: 因為爬文似乎都是分開說明(針對.php或https)
: 努力結合了幾次仍然失敗..QQ
: 先謝謝各位了 ><
因為你說你用 Apache 架站, 那就先假設你有完整的控制權
這樣子可以把功能拆分到兩個 VirtualHost 比較簡單
80 port 只要負責把請求原封不動的丟到 https 就行了
整個設定只要這四行:
<VirtualHost *:80>
ServerName example.com
Redirect 301 / https://example.com/
</VirtualHost>
這個很好用, 因為你不用再去組合你的網址
它會自動幫你把 path 後面的東西貼到 example.com/ 後面去
這邊設定的 path 是 /, 等於全部轉過去
然後在 port 443 這邊放完整的網站設定檔
用 rewrite 處理你的隱藏副檔名
這邊邏輯很簡單, 把附檔名加上去以後有找到檔案的就決定是它了
看你要先找 .html 還是先找 .php 自己調整:
<VirtualHost *:443>
略.....
<Directory 略.....>
略.....
<IfModule rewrite_module>
RewriteEngine On
# 找看看 .htm 檔案
RewriteCond %{REQUEST_FILENAME}.html -s
RewriteRule . %{REQUEST_FILENAME}.html [END]
# 再找看看 .php 檔案
RewriteCond %{REQUEST_FILENAME}.php -s
RewriteRule . %{REQUEST_FILENAME}.php [END]
</IfModule>
</Directory>
</VirtualHost>
那如果今天你沒有 Apache 控制權怎麼辦?
或許看完上面的你也能寫出來了
但還是給你一個 .htaccess 結合兩者的例子
<IfModule rewrite_module>
RewriteEngine On
# 去吧 https, 注意這邊用 .*
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{SERVER_NAME}%{REQUEST_URI} [END,R=301]
# 找看看 .htm 檔案
RewriteCond %{REQUEST_FILENAME}.html -s
RewriteRule . %{REQUEST_FILENAME}.html [END]
# 再找看看 .php 檔案
RewriteCond %{REQUEST_FILENAME}.php -s
RewriteRule . %{REQUEST_FILENAME}.php [END]
</IfModule>
使用 rewrite 的技巧之一, 就是不要想把事情一次做完
其實 RewriteCond 就像 if, RewriteRule 就像 then (只是比喻, 實際上...)
所以跟在寫程式一樣, 可以用很多個 if...then 來拆分
然後這邊是用 Apache 2.4 為例, 其中 [END] 這東西在 Apache 2.3.9 後才有
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 210.68.230.200
※ 文章網址: https://www.ptt.cc/bbs/PHP/M.1459459907.A.9B9.html