Apache, SSL curinga e mod_rewrite

1

Eu tenho um certificado SSL curinga, que está funcionando bem:

<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>

Eu, então, tenho vários sub-domínios que escutam na porta 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>

O que é ótimo. Posso acessar o link ou link e tudo é feliz.

Agora, o truque é, até onde eu sei, não há como saber se a solicitação é SSL ou não nesta configuração.

Por exemplo, todas as variáveis de ambiente apontam para a solicitação ser não-ssl mesmo quando é uma solicitação SSL. Eu suspeito que isso se deva à implementação do mod_ssl.

Em particular, quero fazer algo assim nos virtualhosts:

RewriteCond %{SERVER_PORT} 80
RewriteCond %{REQUEST_URI} dashboard
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [L]

Mas recebo um loop de redirecionamento porque SERVER_PORT é sempre 80, mesmo sob SSL.

Eu também tentei adicionar um SetEnv IS_SSL 1 no primeiro host virtual star.mydomain.com, mas a variável também não está disponível para o mod_rewrite.

Sem criar hosts virtuais ssl / não-ssl separados para cada domínio, há uma maneira de fazer isso funcionar?

Obrigado!

    
por Gary Richardson 24.06.2010 / 01:32

1 resposta

2

Eu sugeriria olhar para a HTTPS variable , que é suposto para ser um indicador confiável de se a conexão atual está usando HTTPS ou não. Você deve ser capaz de fazer algo assim:

RewriteCond %{HTTPS} off
RewriteRule ^/dashboard.* https://%{HTTP_HOST}%{REQUEST_URI} [L,R]

Eu recomendaria usar o sinalizador [R] para forçar um redirecionamento externo porque, de acordo com a documentação, o Apache verifica se o nome do host na URL redirecionada é o mesmo que o da solicitação atual e, nesse caso, ele remove o esquema e o nome do host e faz apenas uma reescrita interna usando o caminho da URL (o que significa que ele ignora a parte https:// de sua regra de reconfiguração).

    
por 24.06.2010 / 06:47