我有一个Apache 2前端,它提供两种请求:
MOD-proxy.conf
ProxyPass /playapp/ http://localhost:9000/
ProxyPassReverse /playapp/ http://localhost:9000/
最终结果是,请求说http://mysite.com/playapp/Controller/action
作为http://localhost:9000/Controller/action
到达Play服务器
现在,玩!正确提供页面,但所有链接,包括javascript,css和其他页面的链接都被破坏。例如,如果视图使用:
#{stylesheet 'style.css' /}
然后渲染的结果是
<link rel="stylesheet" type="text/css" href="/public/stylesheets/style.css" charset="utf-8" ></link>
因此最终用户尝试抓取http://mysite.com/public/stylesheets/style.css
,它返回404,因为它实际上不是Play的一部分!应用
配置Apache + Play在这里播放的正确方法是什么?
我正在寻找的结果是Play!在最终呈现的HTML中返回诸如此类的URL(或者也许是为了相应地重写URL):http://mysite.com/playapp/public/stylesheets/style.css
另外,我确实需要一些能力来链接Play应用程序之外。例如,我希望将主路由(/)映射到我的绝对根(http://mysite.com/
),而不是Play的根。
答案 0 :(得分:3)
首先,重要的事情:apache2无法(轻松)更改页面中的链接。所以Play必须提供正确的。
使用子域名将使所有这些完全透明,但让我们解决你的问题。
你的问题确实有两点,
使用刚设置的路线
GET / playapp / public / staticDir:public
您使用的是http.path吗?
我认为反向应该考虑到它......
这听起来很简单:如果它在播放应用程序之外,那么你没有使用反向网址,所以只需将绝对路径放在你的链接中......或者你正在使用反向?如果是这样,你能提供一个例子吗?
答案 1 :(得分:1)
您是否使用
配置了application.confXForwardedSupport=127.0.0.1
和你的apache.conf
ProxyPreserveHost on
如果不起作用的替代选项来自之前的帖子。
我相信我在这篇文章中给出的答案与你的情况有关
how to use "war.context" in Configuration file of Play Framework ?
基本上,它意味着从属性文件中读取一些值,并将该值预先挂起到所有路由。这是servlet部署的建议方法,其中路径从默认播放设置使用的路径更改。
答案 2 :(得分:1)
期望Apache重写HTML,JS和CSS文件是愚蠢的。 JS中的SWF文件或动态构造的URL怎么样?无论如何,你得到我的漂移。 ProxyPassReverse documentation州:
只有上面特别提到的HTTP响应头 重写。 Apache不会重写其他响应头,也不会 重写HTML页面内的URL引用。这意味着,如果 代理内容包含绝对URL引用,它们将绕过 代理人。一个第三方模块,它将查看HTML和 重写URL引用是Nick Kew的mod_proxy_html。
正如其中一条评论建议的那样,更有可能成功的方法是配置另一个DNS名称(例如play.ripper234.org)并创建一个配置,例如:
<VirtualHost>
ServerName play.ripper234.org
ProxyPass / http://localhost:9000/
ProxyPassReverse / http://localhost:9000/
</VirtualHost>
如果Play返回的文件,即使这样也不会“保存”你!将使用完全限定的网址,例如http://localhost:9000/或http://www.yahoo.com/或其他。
至于推荐一个不同的Web服务器,我实际上认为你应该坚持使用Apache。它具有非常合理和强大的配置,并且它足够快速满足您的所有需求。一般来说,Apache并不是特别慢。有更适合嵌入式使用的Web服务器,并且Web服务器更适合尽可能快地提供大量静态页面。在你变得真的之前,你不应该担心。
答案 3 :(得分:0)
播放1.x支持“http.path”设置。
Play 2.1-snapshot已经支持配置设置“application.context”,将应用程序上下文放在子目录下。
请检查此提交:
Allow root context using [application.context] configuration setting.