我原本在 SO 上问了这个问题但也许旧金山是解决这个问题的更好的地方。
当 GWT 位于反向代理之后时,我遇到了这个问题。后端应用程序部署在上下文中 - 我们称之为 /context。
当我直接点击它时,GWT 应用程序运行良好:
我可以在它前面配置一个反向代理。这是我的 nginx 示例:
上游后端 { 服务器 127.0.0.1:8080; } ... 地点 / { 代理通过 http://backend/context/; }
但是,当我通过反向代理运行时,GWT 变得困惑,说:
2009-10-04 14:05:41.140:/:WARN: 登录: 错误: 未找到序列化策略文件“/C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc”;您是否忘记将其包含在此部署中? 2009-10-04 14:05:41.140:/:WARN: 登录:警告:无法获取模块“https://hostname:444/”的 SerializationPolicy“C7F5ECA5E3C10B453290DE47D3BE0F0E”;将使用与 1.3.3 兼容的旧版序列化策略。因此,您可能会遇到 SerializationException。 2009-10-04 14:05:41.292:/:WARN: StoryService: 错误:未找到序列化策略文件“/0445C2D48AEF2FB8CB70C4D4A7849D88.gwt.rpc”;您是否忘记将其包含在此部署中? 2009-10-04 14:05:41.292:/:WARN: StoryService: 警告:无法获取模块“https://hostname:444/”的 SerializationPolicy“0445C2D48AEF2FB8CB70C4D4A7849D88”;将使用与 1.3.3 兼容的旧版序列化策略。因此,您可能会遇到 SerializationException。
换句话说,GWT 没有得到它需要添加 /context/ 然后查找 C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc 的词,但只有当请求通过代理时才会得到。一种解决方法是将上下文添加到网站的 URL 中:
位置 /上下文/ { 代理通过 http://backend/context/; }
但这意味着上下文现在是用户看到的 url 的一部分,这很糟糕。
在这种情况下有人知道怎样让 GWT 满意吗?
软件版本:
GWT - 1.7.0(与1.7.1有同样的问题)
Jetty - 6.1.21(但在tomcat下存在同样的问题)
nginx - 0.7.62(在apache 2.x下存在同样的问题)
我怀疑 GWT 可能正在接收 Referer 标头,并且感到困惑(nginx 有没有办法关闭该标头?)或者存在差异,因为代理和 GWT/Jetty 之间的流量是 HTTP/1.0 而不是 HTTP/1.1。
答案1
我想你应该
location /context/ {
proxy_pass http://backend/context/;
}
然后使用重写从 URL 中删除 /context 部分