O Apache envia uma resposta de texto sem formatação ao acessar o site habilitado para SSL sem HTTPS

5

Eu nunca encontrei algo assim antes. Eu estava tentando simplesmente redirecionar a página para a versão HTTPS se ela determinou que o HTTPS estava desativado, mas, em vez disso, está exibindo uma página HTML em vez de redirecionar de fato ; e ainda mais estranho, está exibindo como text / plain!

A Declaração do VirtualHost (Sort of):

ServerAdmin [email protected]
DocumentRoot "/path/to/files"
ServerName example.com
SSLEngine On
SSLCertificateFile /etc/ssh/certify/example.com.crt
SSLCertificateKeyFile /etc/ssh/certify/example.com.key
SSLCertificateChainFile /etc/ssh/certify/sub.class1.server.ca.pem
<Directory "/path/to/files/">
    AllowOverride All
    Options +FollowSymLinks
    DirectoryIndex index.php
    Order allow,deny
    Allow from all
</Directory>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://example.com:6161 [R=301]

A saída da página:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>
<p>The document has moved <a href="https://example.com:6161">here</a>.</p>
<hr>
<address>Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/1.0.0e DAV/2 Server at example.com Port 443</address>
</body></html>

Eu tentei mover o material de Rewrite para cima do material SSL, esperando que ele fizesse algo e nada acontecesse. Se eu visualizar a página com HTTPS, ela será exibida como deveria. Obviamente, está detectando que estou tentando reescrever o caminho, mas não está agindo.

O log de erros do Apache não indica nada para mim que possa ter dado errado.

Quando removo o RewriteRules:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Reason: You're speaking plain HTTP to an SSL-enabled server port.<br />
Instead use the HTTPS scheme to access this URL, please.<br />
<blockquote>Hint: <a href="https://example.com/"><b>https://example.com/</b></a></blockquote></p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/1.0.0e DAV/2 Server at example.com Port 443</address>
</body></html>

Eu recebo a resposta padrão "você não pode fazer isso porque não está usando SSL", que também é fornecida em text / plain em vez de ser renderizada como HTML. Isso faria sentido, só deveria funcionar para conexões ativadas para HTTPS, mas ainda quero redirecioná-las para a conexão HTTPS quando ela determina que não está habilitada.

Pensando que poderia contornar o sistema:

Eu tentei adicionar um ErrorDocument 400 https://example.com:6161 ao arquivo de configuração em vez de usar RewriteRules, e isso me deu uma nova mensagem, ainda sem queijo.

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>302 Found</title>
</head><body>
<h1>Found</h1>
<p>The document has moved <a href="https://example.com:6161">here</a>.</p>
<hr>
<address>Apache/2.2.21 (Unix) mod_ssl/2.2.21 OpenSSL/1.0.0e DAV/2 Server at example.com Port 443</address>
</body></html>

Como posso forçar o Apache a redirecionar, em vez de exibir uma página "301" que mostra HTML em formato de texto simples?

    
por animuson 17.12.2011 / 00:47

1 resposta

1

Primeiro: Com o Apache, você não pode ter HTTPS e HTTP em execução na mesma porta.

Consulte: O Apache responde a HTTP e HTTPS em a mesma porta

Para lidar com tráfego SSL e não SSL, você precisa definir dois hosts virtuais.

Consulte: Redirecionar http para https apache em portas diferentes

Para o redirecionamento do host virtual não SSL para o host virtual SSL, usamos isto:

<VirtualHost *:80>
        RewriteEngine on
        RewriteCond  %{HTTPS} !=on
        RewriteCond  %{HTTP_HOST} ^(.*)$
        RewriteRule  ^(.*)/? https://%1$1 [L,R]
</VirtualHost>

Continua o problema de que o envio explícito de uma solicitação não SSL para a porta ativada por SSL ( link ) fornece o seguinte:

You're speaking plain HTTP to an SSL-enabled server port

página como texto simples (em um navegador Firefox). O envio explícito de uma solicitação SSL para a porta não SSL ( link ) fornece um:

ssl_error_rx_record_too_long error

(no navegador Firefox).

Por que isso está ocorrendo?

    
por 14.05.2013 / 14:03