Перезапуск перенаправления HTTP на HTTPS (порт не по умолчанию)

Допустим, приложение, защищенное SSL, работает на нестандартном HTTPS-порту. 9999,

Когда пользователь получит доступ к такой странице:

https://myapp.com:9999

правильный ответ будет возвращен.

Но когда он попытается получить доступ к странице незащищенным способом - вот так:

http://myapp.com:9999

это возвращаемый ответ (шестнадцатеричный):

15 03 01 00 02 02 0A

что на самом деле означает:

15 alert
03 01 Version
00 02 Length
02 0A Fatal-unexpected message

Теперь возникает вопрос: можно ли в этом случае перенаправить пользователя с HTTP на HTTPS с помощью Restlet?

PS: обратите внимание, что перенаправление / переопределение URI с помощью Apache или аналогичного решения - это не то, что я ищу.

1 ответ

Решение

Нелегко перенаправить с HTTP на HTTPS на тот же порт. Обычно порт выделяется для каждого протокола. Когда вы видите перенаправление с http на https на общедоступном веб-сайте (используя порты по умолчанию), первым запросом является http://example.com/ (который браузер запрашивает через порт 80, по умолчанию для HTTP), и он возвращает ответ, который является перенаправлением на https://example.com/ (который браузер запрашивает через порт 443, по умолчанию для HTTPS).

При использовании сервера приложений, такого как Restlet, типичным способом обработки этого перенаправления является размещение перед ним веб-сервера, такого как Apache httpd, прослушивание HTTP на порту 80 и HTTPS на порту 443 и прокси их обоих на порт 9999 (который вам не нужно показывать в Интернете, так как он будет доступен только по шлейфу).

Но когда вы подключаетесь к http://myapp.com:9999/, ваш сервер приложений в первую очередь ожидает рукопожатие TLS, и ваш браузер или пользовательский агент не предоставит его, поскольку это не требуется для обычного протокола HTTP. Тем не менее, вы могли бы найти способ определить протокол, который использует браузер, и динамически реагировать на него. Для более подробного объяснения творческого способа сделать это, посмотрите этот пример обнаружения протокола node.js. Если вам действительно нужно использовать один порт для двух протоколов, то в Restlet можно сделать то же самое.

Другие вопросы по тегам