![Apche http mod_rewrite 和 HTTPS](https://linux22.com/image/738889/Apche%20http%20mod_rewrite%20%E5%92%8C%20HTTPS%20.png)
我有两个域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
答案1
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。
答案2
感谢大家的帮助。
问题是下面的部分在另一个文件中重复了。
<VirtualHost *:443>
</VirtualHost>
但是我接受了@MrWhite 的解决方案,因为他建议在配置上做出两项改进:将每个域拆分到单独的 vHost 中并删除HTTPS
服务器变量。
谢谢