Forçando o SSL no Apache sem codificar o hostname

4

Eu acho que tenho isso ordenado (graças principalmente à pergunta ), mas eu ainda não entendo completamente um par de coisas.

Eu gostaria de forçar todas as conexões não-SSL para o meu servidor a serem roteadas para SSL. Eu tenho apenas um vhost (e isso permanecerá confiável para o tempo de vida do servidor), mas eu gostaria de evitar codificar permanentemente o nome do domínio, em parte para que os arquivos httpd.conf para Staging e Production permaneçam idênticos. / p>

Eu sei que posso forçar solicitações para usar SSL com uma regra mod_rewrite como

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

ou

RewriteCond %{SERVER_PORT} ^80$
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Eu tenho duas perguntas relativamente simples:

  1. Devo preferir uma dessas declarações RewriteCond sobre a outra por algum motivo? Presumivelmente, se eu usar a variável %{SERVER_PORT} , todas as conexões na porta 8000, por exemplo, continuariam a ser atendidas sem erros? Existe algum motivo para eu evitar usar a variável %{HTTPS} que estou negligenciando?
  2. A variável %{HTTP_HOST} na instrução RewriteRule será respeitada e será substituída automaticamente em qualquer que seja o cabeçalho Host: da solicitação? Existe alguma circunstância em que isso pode não funcionar?

Caso isso faça diferença, estamos executando o Apache 2 no RedHat com mod_ssl e o site usado no Drupal 7.

Desculpe pelo que é uma pergunta relativamente estúpida; O Apache Sysadmin não é de forma alguma uma parte essencial do meu trabalho, então estou tentando passar o melhor que posso. Obrigado, tudo!

    
por Owen Blacker 16.01.2012 / 19:21

1 resposta

5

Eu sempre usei algo como o seguinte:

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

Porque, ocasionalmente, eu gosto de servir HTTP em outras portas além de 80. Bem, eu não gosto de fazer isso, mas às vezes preciso de etc. %{HTTPS} será verdadeiro, por exemplo, se o SSL estiver sendo usado pela porta 80.

Acho que costumo usar

RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

%{HTTP_HOST} será sempre o que estiver definido como Host: pelo cliente.

Ocorre-me, no entanto, que há outra maneira de fazer isso.

<VirtualHost *:80>
   ServerName mysite.example.com
   Redirect permanent / https://mysite.example.com/
</VirtualHost>

Você notará que não há DocumentRoot no bloco acima. Se você está redirecionando tudo , você não precisa de um.

Se você quiser redirecionar apenas um pouco do seu site para SSL, basta fazer

Redirect permanent /secure https://mysite.example.com/secure

Acho que a opção Redirecionar é mais preferível para o forçamento total de HTTPS do site, porque é um nível de insanidade menor (conforme fornecido gentilmente pelo mod_rewrite).

Pode até ser mais rápido, pois há um módulo a menos para carregar / executar.

    
por 17.01.2012 / 14:30