Библиотека веб-сокетов, на которую я полагаюсь (PHP-веб-сокеты) еще не поддерживает безопасные сокеты (wss
). Мой сайт обслуживается https
хотя, поэтому я не могу использовать небезопасный ws
соединения.
Я пытаюсь использовать Apache's mod_proxy
для пересылки защищенного запроса, поступающего от браузера, клиенту.
Javascript
var ws = new Websocket('wss://example.com/_ws_/');
Apache VirtualHosts
ProxyPass "/_ws_/" "ws://127.0.0.1:8080/"
ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
# I've also tried "/_ws_/" "ws://example.com:8080/" Same error below
При попытке подключения браузер получает сообщение 500 Server Error
. Журналы показывают:
Для URL / _ws_ / не действовал обработчик протокола. Если вы используете DSO-версию mod_proxy, убедитесь, что подмодули прокси включены в конфигурацию с помощью LoadModule.
Я подтвердил, что если я удалю правила прокси, перестанет перенаправлять пользователей на https
и попробуйте подключиться к незащищенным сокетам из браузера: new Websocket('ws://example.com/')
, все работает нормально.
Мои загруженные модули Apache включают mod_ssl.c
, mod_proxy.c
и mod_proxy_http.c
Apache 2.4
Чтобы все заработало, мне также нужно было загрузить mod_proxy_wstunnel
Как только я это сделал, этот набор правил начал работать: (в VirtualHost
домена, который получает и передает запрос веб-сокета)
<IfModule mod_proxy.c>
ProxyPass "/_ws_/" "ws://127.0.0.1:8080/"
ProxyPassReverse "/_ws_/" "ws://127.0.0.1:8080/"
</IfModule>
Затем браузер может связаться с внутренним сервером WS через порт HTTPS:
var ws = new Websocket('wss://example.com/_ws_/');