仅靠X-Forwarded-Prefix能否重构原始请求URL?
首先,目前并没有被广泛支持的、类似X-Forwarded-Cut的通用HTTP头部来直接传递需要移除的目标路径前缀。不过你可以通过以下几种方式解决问题,同时尽量保持兼容性:
1. 使用X-Forwarded-Uri头部传递原始完整请求路径
很多主流代理服务器(如Nginx、Apache)都支持X-Forwarded-Uri头部,它的作用是直接传递客户端发送给代理的完整原始请求URI(比如你的场景中就是/proxypath/pub/index.html)。
当代理server1转发请求到server2时,除了添加X-Forwarded-Prefix: /proxypath,额外添加X-Forwarded-Uri: /proxypath/pub/index.html。server2收到请求后,不需要计算路径切割,直接用X-Forwarded-Uri的值作为原始请求路径即可,完全避开需要移除/folder的问题。
这种方式的优势是X-Forwarded-Uri属于被广泛认可的非标准头部,兼容性比自定义头部好很多。
2. 扩展X-Forwarded-Prefix的格式来编码切割信息
如果你坚持只用X-Forwarded-Prefix,可以约定一个两端能解析的格式,在其中同时包含原始前缀和需要移除的目标路径前缀。比如:
X-Forwarded-Prefix: /proxypath;cut=/folder
server2拿到这个头部后,先解析出cut字段的值/folder,将自身当前的请求路径(/folder/pub/index.html)中的/folder替换为/proxypath,就能得到原始路径/proxypath/pub/index.html。
需要注意的是,这种方式属于对X-Forwarded-Prefix的自定义扩展,虽然复用了现有头部字段,但需要你的自研服务器两端都实现对应的解析逻辑,兼容性不如直接用X-Forwarded-Uri。
3. 使用标准化的Forwarded头部(RFC 7239)
RFC 7239定义的Forwarded头部是标准化的代理信息传递头部,你可以在其中添加自定义参数来携带路径切割信息,比如:
Forwarded: for=192.0.2.60; proto=http; host=server1; prefix="/proxypath"; cut="/folder"
不过Forwarded头部的自定义参数并没有被广泛实现,所以兼容性可能不如X-Forwarded系列头部,但胜在符合标准规范。
内容的提问来源于stack exchange,提问作者Sebastian

