У меня есть сертификат SSL с подстановочными знаками, который работает нормально:
<VirtualHost *:443>
ServerName star.mydomain.com
DocumentRoot /dev/null
SSLEngine On
SSLCertificateFile /etc/httpd/conf.d/star.mydomain.com.crt
SSLCertificateKeyFile /etc/httpd/conf.d/star.mydomain.com.key
SSLCertificateChainFile /etc/httpd/conf.d/star.mydomain.com.gd_bundle.crt
</VirtualHost>
Затем у меня есть различные поддомены, которые прослушивают порт SSL:
<Virtualhost *:80 *:443>
ServerName staging.mydomain.com
DocumentRoot /var/www/staging.mydomain.com/
CustomLog logs/staging.mydomain.com.log combined
AccessFileName .htaccess
DirectoryIndex index.php index.html
</VirtualHost>
<Virtualhost *:80 *:443>
ServerName www.mydomain.com
DocumentRoot /var/www/www.mydomain.com/
CustomLog logs/www.mydomain.com.log combined
AccessFileName .htaccess
DirectoryIndex index.php index.html
</VirtualHost>
Что здорово. Я могу пойти в http://staging.mydomain.com/ или https://staging.mydomain.com/ и все устраивает.
Насколько я могу судить, фокус в том, что есть известный способ узнать, является ли запрос SSL или нет в этой конфигурации.
Например, все переменные среды указывают на то, что запрос не является ssl, даже если это запрос SSL. Я подозреваю, что это связано с реализацией mod_ssl.
В частности, я хочу сделать что-то подобное в виртуальных хостах:
RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} dashboard
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]
Но я получаю цикл перенаправления, потому что SERVER_PORT всегда 80, даже при использовании SSL.
Я также пробовал добавить SetEnv IS_SSL 1 в первый виртуальный хост star.mydomain.com, но эта переменная также недоступна для mod_rewrite.
Есть ли способ сделать эту работу без создания отдельных виртуальных хостов ssl / non-ssl для каждого домена?
Спасибо!
Я бы посоветовал посмотреть на HTTPS
переменная, который должен быть надежным индикатором того, использует ли текущее соединение HTTPS или нет. У вас должно получиться что-то вроде этого:
RewriteCond %{HTTPS} off
RewriteRule ^/dashboard.* https://%{HTTP_HOST}%{REQUEST_URI} [L,R]
Я бы рекомендовал использовать [R]
флаг для принудительного внешнего перенаправления, потому что, согласно документации, Apache проверяет, совпадает ли имя хоста в перенаправленном URL-адресе с именем в текущем запросе, и если да, он удаляет схему и имя хоста и выполняет только внутреннее переписать, используя путь URL (что означает, что игнорируется https://
часть вашего правила перезаписи).