【问题标题】:How do I define Play assets and APIs to be served from a different sub-directory in production?如何定义从生产中的不同子目录提供的 Play 资产和 API?
【发布时间】:2016-08-29 04:31:14
【问题描述】:

我正在使用 Play 2 框架。如果我不使用版本化资产,所有资产都会在本地正确呈现(但不是生产)。

我要求从 localhost:9000/assets/* 提供本地资产,但是在生产中,资产将从 www.domain.com/subfolder/assets/* 提供

我还需要确保在生产中以类似的方式从 localhost:9000/api/*www.domain.com/subfolder/api/* 提供 API。这是因为 www.domain.com 上已经有一个应用程序在运行,并且它的资产是使用完全不同的技术(PHP 而不是 Java / Scala)编写和提供的。

我的游戏路线定义:

# Map static resources from the /public folder to the /assets URL path
GET     /assets/v/*file               controllers.Assets.versioned(path="/public", file: Asset)

资产被加载到header.scala.html 文件中:

<link rel="stylesheet" href="@routes.Assets.versioned("template/css/bootstrap.css").absoluteURL()" />
<link rel="stylesheet" href="@routes.Assets.versioned("stylesheets/main.css").absoluteURL()" />

我正在将 js 资源加载到 footer.scala.html 文件中,如下所示:

<script src="@routes.Assets.versioned("template/js/jquery.min.js").absoluteURL()"></script>
<script src="@routes.Assets.versioned("template/js/bootstrap.min.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("template/angular/angular.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-animate.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-cookies.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-route.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-resource.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("template/angular/angular-sanitize.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("javascripts/app.js").absoluteURL()"></script>
<script type="text/javascript"
src="@routes.Assets.versioned("javascripts/appController.js").absoluteURL()"></script>

<script type="text/javascript" src="@routes.Assets.versioned("javascripts/moment.js").absoluteURL()">    </script>

我的 play 应用程序使用 Apache 中的反向代理配置提供服务,该配置正确地从 www.domain.com/subfolder 提供服务

但是,API 和资产仍希望从 www.domain.com 加载,而不是从 www.domain.com/subfolder 加载

如何正确加载资产,以便它们在开发和生产中都正确加载?

我已经查看了https://www.playframework.com/documentation/2.5.x/AssetsOverview,因为我说资产在生产中加载到/assets 文件夹而不是subfolder/assets

非常感谢任何帮助!

更新

按照 Kim 的回答,我尝试了以下方法:

ProxyPreserveHost On
ProxyPass /sportsbook http://127.0.0.1:9000 retry=0
ProxyPassReverse /sportsbook http://127.0.0.1:9000 retry=0

ProxyHTMLEnable Off
ProxyHTMLURLMap http://localhost:9000 /sportsbook
<Location /sportsbook/>
    ProxyPassReverse http://localhost:9000/
    SetOutputFilter proxy-html
    ProxyHTMLURLMap /           /sportsbook/
    ProxyHTMLURLMap /sportsbook            /sportsbook
</Location>

但这会破坏主站点(没有 css 或 js 工作)。有什么想法吗?

【问题讨论】:

    标签: java apache scala .htaccess playframework-2.0


    【解决方案1】:

    在反向代理中重写您的请求可能比更改应用程序中的路径更容易、更灵活。 apache docs 向您展示了如何使用 mod_rewrite 做到这一点。可以很简单

    RewriteRule "^/subfolder/(.*)" "http://playapp.example.com/$1" [P]
    

    【讨论】:

    • 谢谢 Kim 我在想这将是一个替代解决方案。它只是从 Play 文档中看到它是可能的。我更愿意在应用程序中处理这一切,以便我可以测试它。但是,您可能是对的。我试试看
    • 您可以在自己的答案中发布您的游戏解决方案。
    • Kim,我在上面的更新中尝试了代码(在原始问题中)。有什么想法吗?
    • 不幸的是,它对我不起作用,尽管我一生都无法弄清楚原因。我没有发现的 Apache 配置可能有问题。我上面的回答暂时有效。
    【解决方案2】:

    我无法解决上述问题,显然从 localhost:9000/subfolder 本地提供资产更容易。

    所以基本上我只是将所有资产更改为指向该目录,而不是在本地和生产中使用 apache 中的代理重定向将 localhost:9000/subfolder 重定向到 website.com/subfolder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-28
      • 2018-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多