Я хотел бы, чтобы мой веб-сервер 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-перенаправление.