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 编码的 Options
和 Get
请求是由 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 请求无法从代理重写。所以无法想象该怎么做:(
(已更新)
我使用 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 编码的 Options
和 Get
请求是由 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 请求无法从代理重写。所以无法想象该怎么做:(