Я бы хотел сделать следующее: используя Apache, перенаправить все следующие URL-адреса:
http://example.com
http://www.example.com
http://beta.example.com
https://example.com
https://www.example.com
https://beta.example.com
туда же: https://beta.example.com. Я близко, но не совсем. Вот что у меня есть:
NameVirtualHost xxx.xxx.xxx.xxx:80
NameVirtualHost xxx.xxx.xxx.xxx:443
### rewrite scheme via http://stackoverflow.com/questions/1100343/apache-redirect-from-non-www-to-www
<VirtualHost xxx.xxx.xxx.xxx:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html/example
CustomLog /var/log/httpd/example-log combined
ErrorLog /var/log/httpd/example-log
</VirtualHost>
<Directory /var/www/html/example>
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ https://beta.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Options -Indexes
Options +FollowSymLinks
DirectoryIndex index.php
</Directory>
<VirtualHost xxx.xxx.xxx.xxx:80>
ServerName beta.example.com
DocumentRoot /var/www/html/example-beta
CustomLog /var/log/httpd/example-beta-log combined
ErrorLog /var/log/httpd/example-beta-log
<IfModule mod_rewrite.c>
RewriteEngine on
# redirect all http -> https
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>
</VirtualHost>
<VirtualHost xxx.xxx.xxx.xxx:443>
ServerName beta.example.com
DocumentRoot /var/www/html/example-beta
ErrorLog /var/log/httpd/example-beta-log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" combined_ssl
CustomLog /var/log/httpd/example-beta-log combined_ssl
SSLEngine on
### SSL details omitted for clarity.
</VirtualHost>
Что я получаю из этого:
http://example.com => https://beta.example.com
http://www.example.com => Content for www.example.com (/var/www/html/example)
http://beta.example.com => https://beta.example.com
https://example.com => https://example.com (correct content but wrong url)
https://www.example.com => https://www.example.com (correct content but wrong url)
https://beta.example.com => https://beta.example.com
Вероятно, стоит отметить, что мой ssl-сертификат полностью поддерживает подстановочные знаки, поэтому я должен быть в этом хорош, и все материалы SSL, похоже, работают (даже когда страницы обслуживаются под https://example.com). Между тем файлов .htaccess нет - все пытаюсь делать через конфиг apache.
Итак, проблема в том, чтобы https://example.com для правильного перенаправления с префиксом www и без него. Есть какие-нибудь советы? Спасибо!
Из того, что я читаю, вам понадобятся две отдельные записи VirtualHost, одна для HTTP и одна для HTTPS. Они различаются портом (: 80 для HTTP и: 443 для HTTPS), а также тем, что у вас есть секция SSL On для HTTPS. У каждого должны быть перечислены все имена:
ServerName beta.example.com
ServerAlias example.com www.example.com
Тогда у вас будет все тот же DocumentRoot и другая информация, перечисленная там. Для HTTP VirtualHost вы уже знаете, что вам нужно перенаправить, потому что вы знаете, что хотите HTTPS, поэтому вам понадобится только RewriteRule:
RewriteRule ^ https://beta.example.com%{REQUEST_URI} [R=301,L]
Для HTTPS VirtualHost вам понадобится тот же RewriteRule, но вам также нужно будет добавить условие:
RewriteCond %{HTTP_HOST} !^beta\.example\.com$
RewriteRule ^ https://beta.example.com%{REQUEST_URI} [R=301,L]
RewriteCond предназначен для предотвращения бесконечного перенаправления.
Это позволит вам контролировать перенаправления в одном месте. Если у вас нет причин создавать VirtualHost для каждого домена, то проще иметь его.