在没有 HTTPS 的情况下访问启用 SSL 的站点时,Apache 发送纯文本响应

在没有 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 连接时,我仍然希望将它们重定向到 HTTPS 连接。

我以为我可以绕过这个系统:

我尝试ErrorDocument 400 https://example.com:6161在配置文件中添加一个,而不是使用 RewriteRules,但这只给了我一条新消息,仍然没有 cheese。

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

我怎样才能强制 Apache 实际重定向而不是显示以纯文本格式显示 HTML 的“301”页面?

答案1

首先:使用 Apache 时不能在同一个端口上运行 HTTPS 和 HTTP。

看:Apache 在同一端口上应答 HTTP 和 HTTPS

为了处理 SSL 和非 SSL 流量,您必须定义两个虚拟主机。

看:将 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 端口发送 SSL 请求(https://mydomain.com:80/)给出:

ssl_error_rx_record_too_long error

(在 Firefox 浏览器中)。

为什么会发生这种情况?

相关内容