Apache-2.2

Apche http mod_rewrite 和 HTTPS

  • June 19, 2019

我有兩個域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
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_aliasRedirect而不是在此處使用 mod_rewrite。

引用自:https://serverfault.com/questions/970747