如何设置在Apache反向代理后面的子目录上播放?

时间:2012-01-04 09:35:55

标签: java apache playframework reverse-proxy

我有一个Apache 2前端,它提供两种请求:

  • 对根文件夹(例如http://mysite.com/http://mysite.com/help)的请求由apache本身(PHP / Wordpress)提供。
  • 对'/ playapp'子文件夹的特定请求将转发给Play!通过mod-proxy通过反向代理:

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的根。

4 个答案:

答案 0 :(得分:3)

首先,重要的事情:apache2无法(轻松)更改页面中的链接。所以Play必须提供正确的。

使用子域名将使所有这些完全透明,但让我们解决你的问题。

你的问题确实有两点,

修复静态资源的子文件夹

使用刚设置的路线

GET / playapp / public / staticDir:public

您使用的是http.path吗?

我认为反向应该考虑到它......

外部链接

  • 此外,我确实需要一些能力链接Play应用程序之外。例如,我想将家乡路线(/)映射到我的绝对根(http://mysite.com/),而不是Play的根。

这听起来很简单:如果它在播放应用程序之外,那么你没有使用反向网址,所以只需将绝对路径放在你的链接中......或者你正在使用反向?如果是这样,你能提供一个例子吗?

答案 1 :(得分:1)

您是否使用

配置了application.conf
XForwardedSupport=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.