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

и ssl, и non-ssl на одном порту

Я хотел бы, чтобы мой веб-сервер apache2 обслуживал как http, так и https на одном порту.
С другим методом, который я пробовал, он либо не работал по http, либо по https ..

Как я могу это сделать?

Обновить:
Если я включу SSL, а затем перейду на http, я получу такую ​​страницу:

<!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://server/"><b>https://server/</b></a></blockquote></p>
<hr>
<address>Apache/2.2.9 (Debian) PHP/5.2.6-1+lenny16 with Suhosin-Patch mod_ssl/2.2.9 OpenSSL/0.9.8g Server at server Port 443</address>
</body></html>

Из-за этого кажется вполне возможным иметь и http, и https на одном и том же порте.
Первым шагом было бы изменить эту страницу по умолчанию, чтобы она отображала заголовок 301-Moved.

Обновление2: В соответствии с этот, это возможно. Теперь вопрос в том, как настроить apache для этого.

Можно перенаправить http на https с помощью настраиваемого ErrorDocument.
Однако в текущей версии Apache невозможно запустить весь веб-сервер как на http, так и на https.

К сожалению, в Apache 2.2-16 есть ошибка, которая еще не исправлена, из-за которой перенаправление работает только в Apache 2.4.

Для получения дополнительной информации смотрите здесь: https://issues.apache.org/bugzilla/show_bug.cgi?id=50823

Обновить
Вот отрывок, который я тестировал на apache 2.4:

<?php
if ($_SERVER["REDIRECT_STATUS"] == "400" && preg_match("/.*?Reason: You're speaking plain HTTP to an SSL-enabled server port\..*/", $_SERVER["REDIRECT_ERROR_NOTES"])) {
    header("Location: https://localhost:999");
} else {
    //echo normal error message
}
?>

Используйте его, установив ErrorDocument 400 /redirect-400-error.php в вашем конфигурационном файле apache. Вы можете найти дополнительную информацию о реализации пользовательских ErrorDocuments Вот.

Трафик SSL не может работать на том же порту, что и трафик без SSL, TLS может это делать, но не используется на веб-серверах. TLS чаще всего используется на SMTP-сервере именно по этой причине.

Один и тот же вопрос уже задавался несколько раз (см. Два примера ниже) разными людьми, и всегда говорилось, что это невозможно, используя только Apache, вам придется использовать какое-то другое программное обеспечение или создать своего собственного слушателя:

Apache2 Перепишите http на https на порту 5553

Apache отвечает на HTTP и HTTPS на одном и том же порте

Также я не смог найти ни одного официального документа Apache, в котором упоминается трафик http и https на том же порту без перенаправления.

Имейте в виду, что когда люди говорят SSL, они обычно имеют в виду SSL / TLS, которые не совпадают.

Я бы воспринял этот ответ apache.org как окончательное НЕТ на ваш вопрос о работе с http и https на том же порту.

    Can we have both http and https listening on the same port?

Comment 1 Eric Covener 2011-11-22 14:36:45 UTC

No, and bugzilla is not for support or Q&A.  Try the users mailing list.

https://issues.apache.org/bugzilla/show_bug.cgi?id=52228

Вы можете попробовать модуль mod_rewrite но я предлагаю вам задать еще один вопрос о том, как использовать его для перенаправления https (вам все равно потребуется несколько портов). Я не работал с этим, поэтому не могу подробно рассказать, как это сделать.

Как я уже сказал, мало что знаю о модуле, поэтому я предполагаю, что вам понадобится три порта. Один порт без SSL для mod_rewrite для прослушивания, один порт без SSL для HTTP-трафика и один порт SSL для https, вам нужно будет сделать порт 999 для mod_rewrite, а затем ваши службы будут прослушивать два разных порта для http и https.

Обратите внимание на то, что Шейн Мэдден сказал в своем комментарии, http-запрос на порт с поддержкой SSL будет давать вам только ошибки, даже если вы поместите mod_rewrite на этот порт.

Простое решение:

ErrorDocument 400 https://server:port/

Теперь вы получаете перенаправление «Найдено» и никаких неприятных сообщений об ошибке.

Я думаю, что это могло бы сработать, определив статический ErrorDocument, например:

ErrorDocument 400 /redirect_https.txt

Затем создайте файл redirect_https.txt в корне вашего документа со следующим содержанием:

HTTP/1.1 302 Found
Location: https://www.example.com/mypage.html

Это работает (даже пробовали) и отправляет браузеру «поддельное» HTTP-перенаправление.