Apache WebSocket代理配置:RewriteRule去掉路径/foo/前缀的方法
Apache WebSocket代理移除路径前缀配置说明
原配置与表现
现有配置如下:
<LocationMatch /foo/> ProxyPreserveHost On RewriteEngine on RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] RewriteRule .* "ws://192.168.0.101:1234%{REQUEST_URI}" [P]
当前运行表现:客户端访问ws://www.example.com/foo/whatever_arbitrary_random时,请求被转发到ws://192.168.0.101:1234/foo/whatever_arbitrary_random,功能正常。
需求说明
保留客户端访问路径的/foo/前缀作为规则触发条件,转发到后端服务时自动去掉/foo/前缀,最终转发目标为ws://192.168.0.101:1234/whatever_arbitrary_random。
可行修改方案
你找到的修改RewriteRule的方案可以满足需求,更稳妥的全路径匹配写法如下:
<LocationMatch /foo/> ProxyPreserveHost On RewriteEngine on RewriteCond %{HTTP:Upgrade} websocket [NC] RewriteCond %{HTTP:Connection} upgrade [NC] # 直接捕获/foo/后的所有路径片段拼接到后端地址 RewriteRule ^/foo/(.*)$ ws://192.168.0.101:1234/$1 [P,L]
不建议在Location块内配置此类规则的原因
Apache官方最佳实践不推荐在Location/LocationMatch块中使用RewriteRule做代理转发,核心原因如下:
- Location块的匹配优先级高于全局重写规则,会打乱重写规则的默认执行顺序,容易出现非预期的匹配结果
- Location块中处理REQUEST_URI等变量的逻辑和全局上下文不同,路径拼接时容易出错
- 此类前缀替换的代理需求可以直接用ProxyPass指令实现,配置更简洁、稳定性更高,参考写法:
ProxyPreserveHost On # 自动处理WebSocket握手,自动移除/foo/前缀 ProxyPass "/foo/" "ws://192.168.0.101:1234/" ProxyPassReverse "/foo/" "ws://192.168.0.101:1234/"
内容的提问来源于stack exchange,提问作者Tomari
相关产品推荐
相关产品推荐

