我的Play上需要一个绝对的URL! 1.2.4应用程序作为OAuth身份验证的回调(使用Scribe。
我的应用程序在Apache虚拟代理后面运行,可通过带有“http://myapp.mydomain.com”等子域的URL访问,代理“http://127.0.0.1:9000”。 ProxyPreserveHost
设置为On
。在我的游戏!应用程序配置,我有以下属性:application.baseUrl=http://myapp.mydomain.com/
。
为了计算这个绝对URL,我使用了一段代码,如:
Router.ActionDefinition ad = Router.reverse("Controller.callback");
ad.absolute();
return ad.url;
此代码适用于Play! 1.2.3:它返回“http://myapp.mydomain.com/callback”。
现在我使用Play! 1.2.4,此代码现在返回“http://www.mydomain.com:9000/callback”(由虚拟代理翻译的URL没有子域名),就好像Play!现在使用HTTP请求的URL来构建这个绝对URL。
我凭经验将此代码替换为Router.getFullUrl("Controller.callback")
,这解决了我的问题。
这两个方法Router.getFullUrl()
和Router.absolute()
没有记录(booo!),我想知道解决我的问题的微妙差异。
我想Router.absolute()
使用当前的HTTP请求来构建绝对URL,Router.getFullUrl()
使用application.baseUrl
配置属性。
我也可能遇到Apache配置问题(因为它显然不是我的技能之一!),但是ProxyPreserveHost
设置为On
,我认为我的虚拟代理对Play来说是透明的!应用程序,我不明白为什么它从Play切换时出现! 1.2.3至1.2.4。
感谢您的帮助。
答案 0 :(得分:4)
你让我好奇所以我去查看代码(点击直接在github中查看相关功能)。而且我同意Play!文档远非完整:),实际上代码会受益于更多的javadoc!
无论如何,这可能是一个错误......或者是误用!,你应该做几个测试:
您应该尝试的一件事是模板绝对符号:@@{…}
。大多数情况下,您不需要在代码中反转网址,只需在模板中。这是否正确?
你试过Router.reverse("action", true)
吗?
如果您从浏览器直接访问“localhost:9000”网址,并使用所有不同的“绝对”选项会发生什么?
在1.2.4代码中:
String getFullUrl(...)
完全等于getBaseUrl() + actionDefinition=reverse(...)
和
String getBaseUrl()
仅在没有请求时定义为application.baseUrl
- 否则使用Http.Request.current().getBase()
。
ActionDefinition.absolute
使用reverse
结果中的一堆变量。
在1.2.3代码中:
@@
代码basically uses:
private String __reverseWithCheck(String action, boolean absolute) {
return Router.reverseWithCheck(action, Play.getVirtualFile(action), absolute);
}
绝对正确,即直接调用reverse(action,absolute = true)但接收字符串而不是ActionDefinition
也许一些游戏开发者会介入...但我试着帮助一点,并在此过程中学习:)我会让你进入比较这两个函数的全部细节,但它们有很大的不同提供腹肌的方法。网址...