mod_rewrite 從 http 埠 XXXX 到 https 埠 XXXX
我無法使用以下規則使 mod_rewrite 工作。
RewriteCond "%{SERVER_NAME}" "home.myhome.net" RewriteCond "%{SERVER_PORT}" "^4388$" RewriteRule (.*) https://home.myhome.net:4389%{REQUEST_URI} [QSA,R=301,L]
此規則在我的 http 虛擬主機部分設置。問題是,重定向只在第一次起作用。第二次在 http 埠4388上輸入不同的 URL 時,我被重定向到https://home.myhome.net:438 8 /…
例如:
- 首先我輸入http://home.myhome.net:4388/pageA>我被重定向到<https://home.myhome.net:4389/pageA
- 下次我輸入http://home.myhome.net:4388/pageB並被重定向到 http s ://home.myhome.net:438 8 /pageB
任何想法如何解決?
我的作業系統詳細資訊:
root@host:~# dpkg -l|grep apache ii apache2 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server ii apache2-bin 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server (modules and other binary files) ii apache2-data 2.4.18-2ubuntu3.5 all Apache HTTP Server (common files) ii apache2-utils 2.4.18-2ubuntu3.5 amd64 Apache HTTP Server (utility programs for web servers) ii python-certbot-apache 0.17.0-1+ubuntu16.04.1+certbot+1 all Apache plugin for Certbot root@host:~# lsb_release -d Description: Ubuntu 16.04.3 LTS
那是我的虛擬主機配置,它有所不同,因為我進行了更多測試,但行為相同。我也放棄了測試所有其他重寫規則,結果相同(以及我在評論中所說的,對於我刷新瀏覽器記憶體的每個測試)。
<VirtualHost *:80> ServerAdmin webmaster@myhome.net DocumentRoot /var/www/html <IfModule mod_rewrite.c> RewriteEngine on RewriteCond "%{SERVER_NAME}" "home.myhome.net" RewriteCond "%{SERVER_PORT}" "^4388$" RewriteRule ^ https://%{SERVER_NAME}:4389%{REQUEST_URI} [noescape,qsappend,redirect=301,last] </IfModule> ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
哦,我忘了說,這台伺服器位於 NAT 網關後面,它執行從外部埠 4388 到內部主機埠 80 以及外部埠 4389 到內部埠 443 的埠轉發。這就是為什麼我需要檢查埠和主機名僅匹配外部流量。
編輯:好的,我找到了一些東西,但也沒有解決方案:我將第一個和以下瀏覽器請求/響應與瀏覽器開發人員工具-> 網路選項卡進行了比較:
第一個請求給了我“ 301 Moved Permanently ”,但下面的請求給了我一個“ 307 Internal Redirect ”。
所以這似乎是一個伺服器問題。問題只是,如果它是 mod_rewrite 中的錯誤還是我的錯,因為規則不正確。
編輯:我現在也使用來自Ondřej Surý 的 Apache PPA的目前 apache 版本 2.4.27-5.1+ubuntu16.04.1+deb.sury.org+1 進行了測試
問候,托馬斯
好的,經過長時間的搜尋,我終於找到了原因。我在我的 https 網站上設置了 HTTP Strict-Transport-Security (HSTS),這就是為什麼瀏覽器不會再次啟動以在該 url 上打開 http 網站並強制使用 https 協議的原因。
給定的例子都是有效的。