反向代理背后的 SOP 问题

Posted

技术标签:

【中文标题】反向代理背后的 SOP 问题【英文标题】:SOP issue behind reverse proxy 【发布时间】:2011-03-30 23:53:18 【问题描述】:

过去 5 个月我一直在开发一个 gwt 应用程序,现在是第三方人员开始使用它的时候了。为了准备这个,他们中的一个在反向代理后面设置了我的应用程序,这立即导致浏览器的同源策略出现问题。我猜响应标头中存在问题,但我似乎无法以任何方式重写它们以使问题消失。这个我试过了

response.setHeader("Server", request.getRemoteAddress());

以某种天真的尝试来模仿我想要的行为。没用(出乎所有人的意料)。

任何对此有所了解的人在阅读本文时很可能会窃笑并摇头,我不怪他们。如果是我,我也会窃笑……我对此一无所知,这自然使这个问题非常难以解决。任何帮助都将不胜感激。

如何让标头重写工作并摆脱我正在处理的 SOP 问题?

编辑:我遇到的确切问题是弹出窗口:

"SmartClient 无法直接联系 网址 'https://localhost/app/resource?action='doStuffs'" 由于浏览器同源策略。 去掉主机和端口号(甚至 如果 localhost) 来避免这个问题, 或使用 XJSONDataSource 协议(其中 允许跨站点调用),或使用 服务器端 HttpProxy 包含在 SmartClient 服务器。”

但是我不应该需要 smartclient HttpProxy,因为我在服务器顶部有一个代理,是吗?我没有迹象表明这可能是一个序列化问题,但也许这条消息隐藏了真正的问题......

解决方案 chris_l 和 saret 都帮助找到了解决方案,但由于我只能标记一个,所以我标记了来自 chris_l 的答案。鼓励读者把他们俩都打起来,他们真的在这里为我而来。解决方案非常简单,只需删除服务器的任何绝对路径并仅使用相对路径,这对我来说就是诀窍。谢谢大家!

【问题讨论】:

【参考方案1】:

html 页面的 URL 和 AJAX 请求的 URL 的“来源”不同时,SOP(用于 AJAX 请求)适用。来源包括主机、端口和协议。

所以如果页面是http://www.example.com/index.html,你的AJAX请求也必须指向http://www.example.com下的东西。对于 SOP,是否存在反向代理并不重要——只要确保 URL——在浏览器中显示(包括端口和协议)——没有什么不同。您在内部使用的 URL 无关紧要 - 但不要在您的 GWT 应用程序中使用该内部 URL!

注意: SmartClient 特殊情况下的解决方案是使用相对 URL(而不是指向同一来源的绝对 URL)。由于相对 URL 不是浏览器中的 SOP 要求,我会说这是 SmartClient 中的一个错误。

【讨论】:

感谢您的回答。我一直在使用 GWT.getModuleBaseURL(),会不会是这个问题? 我真的有点不确定 getModuleBaseURL()。但我所知道的是,配置应用程序服务器(您使用哪一个?)以了解代理通常是一个好主意 - 因此,每当您要求服务器给您 URL 时,它都会返回代理的公共 URL .以下是在Tomcat 6 中的操作方法(请参阅 元素)。 啊,谢谢。我正在运行 Tomcat 6,我马上试试。 不,这没有帮助。不过,谢谢你的建议,我真的很感激。 这不是 SmartClient 中的错误,只是您应该使用指向 可公开访问 代理的绝对 URL,而不是您的内部应用程序或本地主机。【参考方案2】:

你到底有什么问题?

以前必须为 GWT 应用程序编写反向代理,我不记得遇到任何 SOP 问题,但您需要做的一件事是确保将响应标头和 uri 重写为反向代理 url - 这包括 ajax 回调 url .


在反向代理后面运行时遇到的一个问题(您可能还会遇到)是 GWT 服务器的序列化策略。

解决此问题需要编写 RemoteServiceServlet 的实现。虽然这是在 2009 年初/中期,但问题似乎仍然存在。

似乎其他人也遇到了这个问题 - see this for further details(特别是 Michele Renda 的回答)

【讨论】:

谢谢你的回答saret。我已经对我正在处理的确切问题进行了澄清,不过我不认为这是一个序列化问题。 一件看起来很奇怪的事情是,通过反向代理你的 url 应该是“localhost/app...”,这应该意味着浏览器在尝试点击“@”时不应该给出 SOP 问题987654323@"。在 GWT 应用程序中的什么时候它会导致问题 - 应用程序在此问题之前加载是否正常? 应用程序在此问题之前加载。当我开始调用服务器时就会出现这种情况...... 尝试检查 javascript/html 中是否有任何 url 仍然指向应用程序的实际 url (localhost:8080/MyApp) 而不是反向代理 url 值得尝试的一件事是尽可能确保你的 url 是相对路径 - 所以你不应该真的需要使用 GWT.getModuleBaseURL()

以上是关于反向代理背后的 SOP 问题的主要内容,如果未能解决你的问题,请参考以下文章

Apache反向代理背后的Keycloak

反向代理背后的密钥斗篷

公共反向代理背后的 WCF Webservice

Nginx 反向代理背后的 Grafana 返回 alert.title

Apache 反向代理背后的 Apache Zeppelin

nginx反向代理背后的grafana