Apche http mod_rewrite 和 HTTPS

Apche http mod_rewrite 和 HTTPS

我有两个域old.examplenew.example

我想重定向old.examplenew.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服务器变量。

谢谢

相关内容