Apache websocket работает с ProxyPass, но не с RewriteRule - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь включить веб-сокеты в AWS веб-приложении ElasticBeanstalk Tomcat 8.5. У меня есть пользовательский apache config (сокращенно):

RewriteEngine On
RewriteOptions Inherit

ProxyRequests Off
ProxyPreserveHost on

# send websocket requests to tomcat with the websocket protocol
RewriteCond ${HTTP:Connection}  "Upgrade" [NC]
RewriteCond ${HTTP:Upgrade}     "websocket" [NC]
RewriteRule /(.*) "ws://localhost:8080/$1" [P,L]

# send all other requests to tomcat
ProxyPass           /   http://localhost:8080/  retry=0
ProxyPassReverse    /   http://localhost:8080/

В веб-приложении, когда я пытаюсь подключить веб-сокет клиента к конечной точке сервера, я получаю эту ошибку:

websocket. js: 372 Сбой подключения WebSocket к 'wss: //example.com/ws/sales': Ошибка при рукопожатии WebSocket: Неожиданный код ответа: 404

Я подтвердил в Инструменты разработчика Chrome, в которых заголовки Connection и Upgrade, отправленные в запросе к вышеуказанной конечной точке, верны. (Очевидно, я действительно подключаюсь к своему веб-сайту, а не к example.com)

Когда я изменяю конфигурацию apache, чтобы использовать ProxyPass вместо RewriteRule, он отлично работает! Я не Я не хочу делать это таким образом, потому что я не хочу, чтобы прокси для ws просто на основе URI. Я хочу проверить заголовки, как вы должны!

ProxyRequests Off
ProxyPreserveHost on

# send websocket requests to tomcat with the websocket protocol
ProxyPass           /ws/    ws://localhost:8080/ws/ retry=0
ProxyPassReverse    /ws/    ws://localhost:8080/ws/

# send all other requests to tomcat
ProxyPass           /   http://localhost:8080/  retry=0
ProxyPassReverse    /   http://localhost:8080/

1 Ответ

0 голосов
/ 20 марта 2020

Я наткнулся на решение этой проблемы просто методом проб и ошибок, которое заключается в удалении флага L (last) из RewriteRule. Что я до сих пор не понимаю, так это то, почему это исправляет. Я подумал, что было бы хорошо опубликовать этот ответ в любом случае.

RewriteEngine On
RewriteOptions Inherit

ProxyRequests Off
ProxyPreserveHost on

# send websocket requests to tomcat with the websocket protocol
RewriteCond %{HTTP:Upgrade}     "websocket" [NC]
RewriteCond %{HTTP:Connection}  "Upgrade" [NC]
RewriteRule .* "ws://localhost:8080%{REQUEST_URI}" [P]

# send all other requests to tomcat
ProxyPass           /   http://localhost:8080/  retry=0
ProxyPassReverse    /   http://localhost:8080/
...