本文介绍了逆向代理背后的GWT问题 - 无论是nginx还是apache的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
当GWT位于逆向代理之后时,我遇到了这个问题。后端应用程序部署在上下文中 - 让我们将其称为/ context。
当我直接点击它时,GWT应用程序正常工作:
我可以在它前面配置一个反向代理。这是我的nginx例子:
$ $ p
上游后端{
server 127.0.0.1:8080;
}
...
位置/ {
proxy_pass http:// backend / context /;
}
但是,当我运行反向代理时,GWT会感到困惑,并说:
2009-10-04 14:05:41.140:/:WARN:登录:错误:序列化策略文件'/C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc'没找到;你忘了把它包含在这个部署中吗?
2009-10-04 14:05:41.140:/:WARN:登录:警告:未能获得模块'https://主机名: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:WARNING:无法获取模块'https://主机名:444 /'的SerializationPolicy'0445C2D48AEF2FB8CB70C4D4A7849D88';将使用传统的兼容1.3.3的序列化策略。作为结果,您可能会遇到SerializationException。
换句话说,GWT没有得到它需要预先加入/上下文/寻找C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc的单词,但只有当请求通过代理服务器时才会发生。解决方法是将上下文添加到网站的url中:
位置/上下文/ {
proxy_pass http:/ /后端/上下文/;
}
但这意味着上下文现在成为用户看到的url的一部分,这很难看。
任何人都知道如何让GWT满意吗?
软件版本:
GWT - 1.7.0(与1.7.1相同的问题)
Jetty - 6.1.21(但同样的问题存在于tomcat下)
nginx - 0.7.62(同样的问题在apache 2下.x)
我使用,但这里没有什么值得注意的。
这里的正确答案是修补源并提交错误报告。另一种选择是在后台运行GWT应用程序 /
。
我更喜欢前者,但后者也应该起作用。如果你真的需要将事情分离到多个上下文中,请使用不同的端口号?
I'm having this problem with GWT when it's behind a reverse proxy. The backend app is deployed within a context - let's call it /context.
The GWT app works fine when I hit it directly:
http://host:8080/context/
I can configure a reverse proxy in front it it. Here's my nginx example:
upstream backend {
server 127.0.0.1:8080;
}
...
location / {
proxy_pass http://backend/context/;
}
But, when I run through the reverse proxy, GWT gets confused, saying:
2009-10-04 14:05:41.140:/:WARN: Login: ERROR: The serialization policy file '/C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc' was not found; did you forget to include it in this deployment?
2009-10-04 14:05:41.140:/:WARN: Login: WARNING: Failed to get the SerializationPolicy 'C7F5ECA5E3C10B453290DE47D3BE0F0E' for module 'https://hostname:444/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result.
2009-10-04 14:05:41.292:/:WARN: StoryService: ERROR: The serialization policy file '/0445C2D48AEF2FB8CB70C4D4A7849D88.gwt.rpc' was not found; did you forget to include it in this deployment?
2009-10-04 14:05:41.292:/:WARN: StoryService: WARNING: Failed to get the SerializationPolicy '0445C2D48AEF2FB8CB70C4D4A7849D88' for module 'https://hostname:444/'; a legacy, 1.3.3 compatible, serialization policy will be used. You may experience SerializationExceptions as a result.
In other words, GWT isn't getting the word that it needs to prepend /context/ hen look for C7F5ECA5E3C10B453290DE47D3BE0F0E.gwt.rpc, but only when the request comes throught proxy. A workaround is to add the context to the url for the web site:
location /context/ {
proxy_pass http://backend/context/;
}
but that means the context is now part of the url that the user sees, and that's ugly.
Anybody know how to make GWT happy in this case?
Software versions:
GWT - 1.7.0 (same problem with 1.7.1)
Jetty - 6.1.21 (but the same problem existed under tomcat)
nginx - 0.7.62 (same problem under apache 2.x)
I've looked at the traffic between the proxy and the backend using DonsProxy, but there's nothing noteworthy there.
解决方案
I'm fairly sure the correct answer here is to patch the source and submit a bug report. Another option would be to run the GWT app at /
on your backend.
I'd prefer the former, but the latter should work too. If you really needed things separated out into multiple contexts, use a different port number?
这篇关于逆向代理背后的GWT问题 - 无论是nginx还是apache的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!