Назад | Перейти на главную страницу

Apache отправляет простой текстовый ответ при доступе к сайту с поддержкой SSL без HTTPS

Я никогда раньше не сталкивался с подобным. Я пытался просто перенаправить страницу на версию HTTPS, если он определил, что HTTPS отключен, но вместо этого отображает страницу HTML, а не фактически перенаправление; и что еще более странно, он отображает это как текст / простой!

Объявление VirtualHost (вроде):

ServerAdmin admin@example.com
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», который также предоставляется в виде text / plain, а не отображается как HTML. Это имело бы смысл, это должно работать только для соединений с поддержкой HTTPS, но я все равно хочу перенаправить их на соединение HTTPS, когда он определит, что он не включен.

Думая, что смогу обойти систему:

Я пробовал добавить ErrorDocument 400 https://example.com:6161 в файл конфигурации вместо использования RewriteRules, и это дало мне новое сообщение, все еще без сыра.

<!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 выполнять перенаправление вместо отображения страницы «301», которая показывает HTML в текстовом формате?

Во-первых: с 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).

Почему это происходит?