Spring Cloud Zuul 反向代理在 URL 编码时不从 CouchDB 获取数据

Spring Cloud Zuul Reverse Proxy doesnt fetch data from CouchDB when URL encoded

(已更新)

我使用 spring-cloud-starter-zuul 创建了一个 Spring 云反向代理,通过我的代理转发所有 pouchDB-CouchDB 请求。并转发所有类似于 http://10.16.33.221:8080/couchdb/** 的请求。 这是我的 application.properties 文件

zuul.routes.couchdb.url=http://10.16.32.85:5984/

ribbon.eureka.enabled=false

server.port=8080

10.16.32.85:5984 是 CouchDB 地址。

pouchDB - CouchDB 同步请求转发时出现问题。我发现一些 URL 编码的 OptionsGet 请求是由 pouch DB 发送的,如下所示 (正斜杠 '/' 被编码为 %2F)

http://10.16.33.221:8080/couchdb/inspection/RailCar%2Fbdbc936f-2c33-46f8-b037-ffa329aa4886?revs=true&latest=true&open_revs=%5B%227-fc6370e4d1cecca0fcc103b0e2763e1e%22%5D&_nonce=1483422848386

http://10.16.33.221:8080 是我的代理,inspection 是数据库名称。

我发现由于安全问题,这些请求是由 apache tomcat 抛出的。按照建议 here,我添加了建议的配置,以允许对我的 Spring 应用程序进行编码 URL。然后编码 URLs 来到我的应用程序,但在转发后没有得到响应。

举个例子,

当我发送以下请求时,

http://10.16.33.221:8080/couchdb/inspection/_changes?since=551

这给出了所需的结果。此请求通过我的 spring 应用程序(代理)发送到 CouchDB。这意味着我的代理工作正常。

http://10.16.33.221:8080/couchdb/inspection/RailCar%2Fbdbc936f-2c33-46f8-b037-ffa329aa4886?revs=true&latest=true&open_revs=%5B%227-fc6370e4d1cecca0fcc103b0e2763e1e%22%5D&_nonce=1483422848386

这给出了 404 not found 作为 HTTP 状态。此请求到达代理,但在将其转发到 CouchDB 后获取结果。

但是如果我像下面这样直接发送相同的 URL 到 CouchDB,

http://10.16.32.85:5984/inspection/RailCar%2fbdbc936f-2c33-46f8-b037-ffa329aa4886?revs=true&latest=true&open_revs=%5B%227-fc6370e4d1cecca0fcc103b0e2763e1e%22%5D&_nonce=1483422848386

它给出了请求响应和 200 HTTP 状态。

但是如果我将带有解码正斜杠的相同 URL 直接发送到 CouchDB,如下所示

http://10.16.32.85:5984/inspection/RailCar/bdbc936f-2c33-46f8-b037-ffa329aa4886?revs=true&latest=true&open_revs=%5B%227-fc6370e4d1cecca0fcc103b0e2763e1e%22%5D&_nonce=1483422848386

它还提供 404 not found 作为 HTTP 状态。现在我很困惑哪里出了问题以及我必须做什么。这个问题浪费了我整个星期。所以请给我任何克服这个问题的建议。

已更新--> 我使用码头服务器来部署 Web 应用程序,码头不需要允许编码的正斜杠。所以我删除了那个配置。然后编码成URLs like

http://10.16.33.221:8080/couchdb/inspection/RailCar%2Fbdbc936f-2c33-46f8-b037-ffa329aa4886?revs=true&latest=true&open_revs=%5B%227-fc6370e4d1cecca0fcc103b0e2763e1e%22%5D&_nonce=1483422848386

在没有任何编码斜杠配置的情况下访问我的代理,但是在转发之后,它们也会给出 404 not found。

谢谢。

找到问题所在。 jetty 和 tomcat 解码传入 URL 的 servlet 路径并转发它们。但是,仍然没有解决这个问题的方法。必须使用过滤器或其他方式重新编码 servlet 路径。但是传入的 Http servlet 请求无法从代理重写。所以无法想象该怎么做:(