Estoy intentando habilitar websockets en una aplicación web AWS ElasticBeanstalk Tomcat 8.5. Tengo una configuración de apache personalizada (abreviada):
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/En la aplicación web, cuando intento conectar el websocket del cliente al extremo del servidor, aparece este error:
websocket.js:372 Falló la conexión de WebSocket a 'wss://example.com/ws/sales': Error durante el protocolo de enlace de WebSocket: Código de respuesta inesperado: 404
Verifiqué en las herramientas para desarrolladores de Chrome que los encabezados de conexión y actualización enviados en la solicitud al punto final anterior son correctos. (Obviamente, realmente me estoy conectando a mi sitio web, no a example.com)
Cuando cambio la configuración de apache para usar ProxyPass en lugar de RewriteRule, ¡funciona perfectamente! No quiero hacerlo de esta manera porque no quiero hacer un proxy a ws simplemente basado en el URI. ¡Quiero revisar los encabezados como se supone que debes hacerlo!
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/Me topé con la solución a esto simplemente por prueba y error, que es eliminar el indicador L (último) de RewriteRule . Lo que no entiendo todavía es por qué eso lo soluciona. Pensé que sería bueno publicar esta respuesta de todos modos.
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/