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

-1
задан 19 June 2019 в 22:42
2 ответа
 RewriteCond% {HTTPS} = включено
RewriteCond% {HTTP_HOST} = old.example
RewriteRule ^ (. *) $ Https: //new.example$1 [R = постоянный, 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
ответ дан 5 December 2019 в 19:11

Спасибо всем за помощь.

Проблема заключалась в том, что приведенный ниже раздел был дублирован в других файлах.

<VirtualHost *:443>

</VirtualHost>

Однако я принял решение @MrWhite, потому что он предложил два улучшения в конфигурации: разделение каждого домен в отдельном vHost и удалить HTTPS серверную переменную.

Спасибо

1
ответ дан 5 December 2019 в 19:11

Теги

Похожие вопросы