Apache-2.2
Apche http mod_rewrite 和 HTTPS
我有兩個域
old.example
和new.example
.我想重定向
old.example
到new.example
發送301
響應程式碼並強制使用 https。使用 HTTP 一切正常,但使用 HTTPS 失敗。即,如果我
http://old.example
在瀏覽器中輸入地址更改為https://new.example
.但是,如果我輸入
https://old.example
沒有任何變化,並且導航繼續使用https://old.example
.下面是 HTTP 和 HTTPS 的配置文件。Apache 版本是 2.2.15 (Unix)
任何人都可以幫助我理解這個問題嗎?
http.conf:
VirtualHost *:80> ServerName 192.0.2.11 ServerAlias old.example www.old.example new.example www.new.example RewriteEngine on RewriteLog "/tmp/rewrite.log" RewriteLogLevel 3 RewriteCond %{HTTP_HOST} =old.example RewriteRule ^(.*)$ https://new.example$1 [R=permanent,L] SecRuleEngine Off ProxyRequests off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ <Location /> Order allow,deny Allow from all </Location> </VirtualHost>
httpd-le-ssl.conf:
<IfModule mod_ssl.c> <VirtualHost *:443> ServerName 192.0.2.11 ServerAlias old.example www.old.example new.example www.new.example SSLEngine on RewriteEngine on RewriteLog "/tmp/rewrite-ssl.log" RewriteLogLevel 3 RewriteCond %{HTTPS} =on RewriteCond %{HTTP_HOST} =old.example RewriteRule ^(.*)$ https://new.example$1 [R=permanent,L] SecRuleEngine Off ProxyRequests off ProxyPreserveHost On <Proxy *> Order deny,allow Allow from all </Proxy> ProxyPass / ajp://localhost:8009/ ProxyPassReverse / ajp://localhost:8009/ <Location /> Order allow,deny Allow from all </Location> Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/old.example/cert.pem SSLCertificateKeyFile /etc/letsencrypt/live/old.example/privkey.pem SSLCertificateChainFile /etc/letsencrypt/live/old.example/chain.pem
RewriteCond %{HTTPS} =on RewriteCond %{HTTP_HOST} =old.example RewriteRule ^(.*)$ https://new.example$1 [R=permanent,L]
目前尚不清楚為什麼這些指令不會重定向
https://old.example
。但是,它並不完全正確,可以立即簡化。例如,它肯定不會重定向www.old.example
,因為您只明確檢查old.example
(完全匹配)(這也適用於埠 80 vHost)。您應該檢查它是否不是new.example
(規範主機名)。檢查
HTTPS
主機內的伺服器變數的埠 443 完全是多餘的。所以,這可以重寫為:
RewriteCond %{HTTP_HOST} !=new.example RewriteRule ^(.*)$ https://new.example$1 [R=permanent,L]
但是,您應該考慮將舊域拆分為單獨的 vHost 並實現一個簡單的 mod_alias
Redirect
而不是在此處使用 mod_rewrite。