Перезапуск перенаправления 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 можно сделать то же самое.