Apache 代理后面的试剂应用程序不呈现

Reagent app behind an Apache proxy does not render

我正在尝试 运行 Apache 代理后面的 Reagent Web 应用程序将 HTTPS 转发到 HTTP Jetty 服务器 运行 连接它后面的 Reagent 应用程序。以下是 Apache 规则:

ProxyPass /bookmarx http://localhost:3000
ProxyPassReverse /bookmarx http://localhost:3000

应用 运行 在本地 运行 时正常,即 http:// localhost:3000。但是,当我通过 Apache 服务器 运行 应用程序时,例如https:// example.com/bookmarx,它只是 returns HTML 起始页(即带有下面代码片段的那个)并且不执行 Javascript (core/init!) 所以我看到的只是一个空白页。

<div id="app"></div>
<script src="js/app.js" type="text/javascript"></script>

有趣的是,我可以调用它背后的Clojure服务,例如https://example.com/bookmarx/api/bookmarks 并且它 returns 书签,所以我知道代理正在转发请求但 ClojureScript 不是 运行ning.

我试过重写规则和 x-forwarded-proto headers,这似乎没有任何区别。

如果我将 Apache 服务器配置为 运行 使用 HTTP 而不是 HTTPS,我也会得到相同的结果,所以我知道这不是 SSL 干扰。

我需要做什么才能通过代理获取应用 运行ning?

原则上 HTTPS 在这里应该无关紧要,唯一重要的是浏览器能否获取资产(HTML+javascript 文件),javascript 是否正确。

首先要做的是打开浏览器开发人员控制台(查看->开发人员->javascript 控制台)并查找错误。检查网络选项卡以确保 javascript 文件已加载...检查 javascript 是否已加载的另一种方法是查看 HTML 的源并单击或打开 link 到 javascript 包括在内。

这里有一些要检查的东西:

  1. 是否加载了js/app.js?尝试导航到 https://example.com/js/app.js(索引页面的根目录与 js 的根目录匹配)。有时,由于配置原因,资产在部署到主机时会通过不同的路由提供服务。
  2. 您部署的 app.js 是使用优化高级编译构建的吗?事情可能会出错!尝试在部署构建中将 advanced 替换为 whitespace 以排除这种情况。如果这是问题所在,您可能缺少一些 javascript externs。请注意,如果您要部署开发版本,则还需要部署编译文件。如果您有一个名为 prod 的构建,则可以使用 lein cljsbuild once prod 在本地测试生产构建。

  3. javascript 控制台中是否报告了任何错误?这里可以有很好的线索。

对于同样的问题,我只是添加了更多的规则,直到问题消失。这是我用来解决 /api:

问题的那个
ProxyPassReverse /api http://0.0.0.0:3001/api
ProxyPass /api http://0.0.0.0:3001/api

我正在使用 Untangled,它更像是一个框架而不是一个库。所以当 Chrome 开发者控制台告诉我这个错误时——那实际上是我第一次意识到甚至有一个 /api.

我找到了问题所在。这是 secretary/account 中的路线错误的结果。它正在寻找“/”的路由,这在本地是正确的,但远程 URL 有“/bookmarx/”。因此,当我将路由更改为“/bookmarx/”时,它运行良好。我想我假设 Apache 在传递 URL 时重写了它。

(花了相当多的消除过程回溯来找出这个无伤大雅的简单答案。事后看来,我本可以直接发布代码,然后也许另一双眼睛会看到它。经验教训。感谢大家的帮助。)