Назад | Перейти на главную страницу

Apache, Wildcard SSL и mod_rewrite

У меня есть сертификат 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:// часть вашего правила перезаписи).