(更新)
我使用spring-cloud-starter-zuul创建了一个Spring cloud Reverse代理,以通过我的代理转发所有pouchDB- CouchDB请求。并转发所有类似于的请求http://10.16.33.221:8080/couchdb/**。这是我的application.properties档案
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地址。
10.16.32.85:5984
当pouchDB-CouchDB同步请求正在转发时发生问题。我发现一些URL编码Options并且Get请求通过邮袋DB发送,如下所示 (正斜杠“ /”编码为%2F)
Options
Get
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是数据库名称。
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。这意味着我的代理工作正常。
这给出了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应用程序,对于码头来说,不需要允许编码的正斜杠。因此,我删除了该配置。然后像
会在我的代理服务器上未对编码的斜杠进行任何配置,但是转发后,这些文件也找不到404。
谢谢。
找到了问题所在。jetty和tomcat解码传入URL的servlet路径并将其转发。但是,仍然没有解决此问题的解决方案。必须使用过滤器或其他方法重新编码servlet路径。但是传入的Http Servlet请求无法从代理重写。所以无法想象该怎么办:(