Restrinja o Apache para permitir apenas o acesso usando SSL para alguns diretórios

34

Eu tenho um servidor Apache 2.2 com um certificado SSL que hospeda vários serviços que devem ser acessados ​​apenas usando SSL.

ou seja: https : //myserver.com/topsecret/ deve ser permitido, enquanto http : //myserver.com/topsecret/ deve ser negado ou, idealmente, redirecionado para https. http://myserver.com/public não deve ter essa restrição e deve funcionar usando http ou https.
A decisão de permitir / negar http é tomada no diretório de nível superior e afeta todo o conteúdo abaixo dele.

Existe uma diretiva que possa ser colocada na configuração do Apache para recuperar o acesso dessa maneira?

DrStalker
fonte

Respostas:

38

A diretiva SSLRequireSSL é o que você está procurando.

Dentro do seu <VirtualHost>, ou no nível superior, se você não estiver usando hosts virtuais:

<Directory /topsecret>
  SSLRequireSSL
</Directory>

Ou em .htaccess:

SSLRequireSSL
Thomas
fonte
11
Bem-vindo à falha do servidor! Nós realmente preferimos que as respostas tenham conteúdo, não ponteiros para o conteúdo. Teoricamente, isso pode responder à pergunta, no entanto, seria preferível incluir aqui as partes essenciais da resposta e fornecer o link para referência. Obrigado!
Chris S
8
Ok, eu atualizei meu cinco anos post com um exemplo :)
Thomas
11
Para ser justo, com 5 anos ou não, o raciocínio é que o link para o qual você aponta pode desaparecer, tornando sua resposta quase total ou completamente inútil para alguém que esteja procurando as informações posteriormente. Na verdade, votei seu comentário sarcástico (honesto), mas também concordo totalmente que a resposta deve ter algum contexto para que continue sendo útil. Especialmente porque está marcado como a resposta correta.
22415 Craig
Eu não acho que a comunidade SO / SF tenha sido tão rigorosa quanto a respostas apenas de um link e "lmgtfy" na época. Mas eu concordo; uma edição retroativa faz sentido a qualquer momento.
Thomas
A qual arquivo de configuração eu adicionaria essa instrução de diretiva?
dan carter
8

Na configuração global você pode usar:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Da mesma forma, você pode usar um arquivo .htaccess no primeiro diretório da árvore de diretórios seguros:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteCond %{HTTPS} !on
   RewriteRule .* https://%{HTTP_HOST}/%{REQUEST_URI} [R=301,L,QSA]
</IfModule>

Esse último também pode ser colocado dentro de uma diretiva de diretório na configuração do host global ou virtual.

Chris S
fonte
Redirecionar HTTP para HTTPS abre para certos tipos de ataques MiTM. Apenas uma cautela.
22715 Craig
1

Como alternativa, você pode usar o idioma do servidor para fazer o processamento para você, em vez de usar as opções de configuração do Apache (se, talvez, você não tiver acesso à configuração do servidor).

Por exemplo, com PHP:

if (!isset($_SERVER['HTTPS'])) {
  // put your redirect here
  header('Location: http://myserver.com/public');
}

(esteja ciente de que, se você estiver usando o ISAPI no Microsoft IIS, se a solicitação não estiver sendo roteada por HTTPS, o valor da variável $ _SERVER ['HTTPS'] ficará "desativado")

Magsol
fonte
1

Alguém mencionou SSLRequireSSL, mas não acho que funcione por si só e não encontrei um exemplo bem-sucedido. A maneira recomendada é https://wiki.apache.org/httpd/RedirectSSL Apliquei isso e funciona bem!

Robert
fonte
0

Supondo que você esteja usando as diretivas do VirtualHost,

Coloque uma diretiva de diretório no host virtual não ssl que nega o acesso.

Em seguida, coloque uma diretiva de diretório no host virtual ssl que concede acesso.


fonte
0

Eu sempre fiz esse mod_rewrite em um arquivo .htaccess, embora você deva fazê-lo também no seu arquivo de configuração principal.

Aqui está um guia com algumas maneiras de fazer isso acontecer: Redirecionamentos inteligentes de HTTP e HTTPS RewriteRule

Jason Wadsworth
fonte