На этот вопрос уже есть ответ здесь:
Я прочитал несколько ответов на SF, и я не приблизился к решению. Моя проблема кажется немного специфичной...
Клиенты обращались к веб-серверу через порт 81. С общей тенденцией к HTTPS, служба была обновлена и установлена на стандартный порт 443. Что очень важно для моей истории, HSTS включена на новом HTTPS-сайте.
На порту 81 мы установили простой редирект Apache:
ServerName example.com
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://example.com/ [END,NE,R=permanent]
Это сработало. Доступ к http://example.com:81 автоматически перенаправляется на https://example.com/
Благодаря HSTS, однако, это работает только один раз. Я представляю, что многие пользователи заходят на сайт по ссылкам, из закладок, из кэшированного поиска Google... и автоматически перенаправляются на http://example.com:81. Даже автозаполнение моего браузера по-прежнему предлагает ссылку :81, так что, думаю, я не один такой.
Их браузеры, имеющие действующую политику HSTS, выполняют внутреннее обновление небезопасного запроса, в результате чего браузер отправляет запрос на https://example.com:81. Он не загружается из-за ошибки SSL - порт не настроен для SSL-трафика.
Таким образом, мне нужен способ перенаправить http://example.com:81 И https://example.com:81 на https://example.com
Я видел, как Webmin при доступе через http://example.com:10000 выдает пользовательское сообщение об ошибке, что сайт активен на HTTPS, которое генерируется Webmin, а не браузером. Даже если бы я смог заставить такую страницу загружаться и реализовать обновление до нового URL, это все равно порадовало бы наших пользователей, пока старый URL воспроизводится и удаляется из ссылок, кэшей и т.д.
Я исправил это, включив HTTPS на порту 81. Это сгенерировало ответ «400 Bad Request» при запросе версии HTTP (т.е. первый раз, когда запрос был сделан, прежде, чем HSTS сможет переопределить запрос). Я настроил Apache для ответа на 400 ошибок с помощью перенаправления:
ServerName example.com
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
RewriteEngine on
RewriteCond %{SERVER_NAME} =example.com
RewriteRule ^ https://example.com/ [END,NE,R=permanent]
ErrorDocument 400 https://example.com/
Это означает, что первые запросы направляются на сайт HTTPS с помощью перенаправления ошибок 400, а последующие запросы на нестандартный порт через HTTPS перенаправляются через RewriteRule
.
HTTP-запросы к портам HTTPS могут показывать сгенерированную сервером ошибку (именно поэтому Webmin может показывать «хорошее» сообщение об ошибке). С другой стороны, HTTPS-запросы к HTTP-портам не могут генерировать ошибку, потому что браузер никогда не достигает точки установления канала связи.