web-dev-qa-db-ja.com

HTTPSを使用せずにSSL対応サイトにアクセスすると、Apacheはプレーンテキスト応答を送信します

私はこれまでこのようなものに遭遇したことがありません。 HTTPSがオフであると判断された場合、単にページをHTTPSバージョンにリダイレクトしようとしましたが、代わりに実際にリダイレクトするのではなくHTMLページを表示しています。さらに奇妙なことに、テキスト/プレーンとして表示されています!

VirtualHost宣言(並べ替え):

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]

ページ出力:

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

何かを実行しても何も起こらないことを期待して、RewriteのものをSSLのものの上に移動しようとしました。 HTTPS経由でページを表示すると、正常に表示されます。パスを書き直そうとしていることを明らかに検出していますが、動作していません。

Apacheエラーログには、問題が発生した可能性のあるものは何も示されていません。

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>

標準の「SSLを使用していないため、これを行うことはできません」という応答が返されます。これは、HTMLとしてレンダリングされるのではなく、テキスト/プレーンでも提供されます。これは理にかなっています。HTTPSが有効な接続でのみ機能するはずですが、有効になっていないと判断された場合は、HTTPS接続にリダイレクトしたいと思います。

システムを回避できると思います:

RewriteRulesを使用する代わりに、構成ファイルにErrorDocument 400 https://example.com:6161を追加しようとしましたが、新しいメッセージが表示されましたが、まだチーズはありません。

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

HTMLをプレーンテキスト形式で表示する「301」ページを表示するのではなく、Apacheに実際にリダイレクトさせるにはどうすればよいですか?

5
animuson

まず、Apacheでは、HTTPSとHTTPを同じポートで実行することはできません。

参照: Apacheは同じポートでHTTPとHTTPSの両方に応答します

SSLトラフィックと非SSLトラフィックの両方を処理するには、2つの仮想ホストを定義する必要があります。

参照: httpを別のポートのhttps Apacheにリダイレクト

非SSL仮想ホストからSSL仮想ホストへのリダイレクトには、次を使用します。

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

非SSL要求をSSL対応ポート( http://mydomain.com:443/ )に明示的に送信すると、次のような問題が残ります。

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

プレーンテキストとしてのページ(Firefoxブラウザの場合)。非SSLポート( https://mydomain.com:80/ )にSSL要求を明示的に送信すると、次のようになります。

ssl_error_rx_record_too_long error

(Firefoxブラウザで)。

なぜこれが起こっているのですか?

1
Peter