У меня два домена 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} = включено 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.
Спасибо всем за помощь.
Проблема заключалась в том, что приведенный ниже раздел был дублирован в других файлах.
<VirtualHost *:443>
</VirtualHost>
Однако я принял решение @MrWhite, потому что он предложил два улучшения в конфигурации: разделение каждого домен в отдельном vHost и удалить HTTPS
серверную переменную.
Спасибо