一尘不染

URL编码后,Spring Cloud Zuul反向代理不会从CouchDB中获取数据

tomcat

(更新)

我使用spring-cloud-starter-zuul创建了一个Spring cloud Reverse代理,以通过我的代理转发所有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编码Options并且Get请求通过邮袋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抛出。并如此处建议的那样我添加了建议的配置,以允许将编码的URL传递给Spring应用程序。然后,已编码的URL进入我的应用程序,但转发后未得到响应。

举个例子

当我发送以下请求时,

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找不到的HTTP状态。此请求到达代理,但在将结果转发到CouchDB后不获取结果。

但是,如果我将相同的网址直接发送给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找不到的HTTP状态。现在,我很困惑问题出在哪里,我该怎么办。这个问题浪费了我整整一周的时间。因此,请给我任何克服此建议。

更新->我使用码头服务器来部署Web应用程序,对于码头来说,不需要允许编码的正斜杠。因此,我删除了该配置。然后像

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。

谢谢。


阅读 225

收藏
2020-06-16

共1个答案

一尘不染

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

2020-06-16