【问题标题】:Reagent app behind an Apache proxy does not renderApache 代理后面的 Reagent 应用程序不呈现
【发布时间】:2016-11-16 16:18:27
【问题描述】:

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

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

当我在本地运行应用程序时,它运行良好,即 http://localhost:3000。但是,当我通过 Apache 服务器运行应用程序时,例如https://example.com/bookmarx,它只是返回 HTML 起始页(即下面带有代码 sn-p 的那个)并且不执行 Javascript(核心/初始化!)所以我看到的只是一个空白页。

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

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

我玩弄了重写规则和 x-forwarded-proto 标头,但这似乎没有任何区别。

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

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

【问题讨论】:

  • 再想一想我开始怀疑我的问题是否与页面使用 core.async 调用服务器以在渲染之前加载书签这一事实有关。当我直接访问 localhost 码头服务器时,它会阻塞,直到返回结果。但是当我通过代理时,它不会阻塞并尝试在返回结果之前呈现页面。如果这确实是问题,我不确定如何解决这个问题。

标签: apache proxy jetty clojurescript reagent


【解决方案1】:

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

首先要做的是打开您的浏览器开发者控制台(视图->开发者->javascript 控制台)并查找错误。检查网络选项卡以确保加载了 javascript 文件...检查加载的 javascript 文件的另一种方法是查看 HTML 的源代码并单击或打开包含的 javascript 的链接。

这里有一些事情要检查:

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

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

【讨论】:

  • 感谢您的建议。 1. 我能够加载 js/app.js 并且当我尝试打开页面时 js 控制台也显示它已加载。 2. 我试过 :whitespace ,不幸的是它没有任何区别。 3. 我在通过 Apache 代理时看到的 js 控制台中的错误是:Error rendering component (in bookmarx.route.current_page) Error: Assert failed: Invalid Hiccup form: [nil] (in bookmarx.route.current_page) (valid-tag? tag) 我不确定由于通过代理而无法呈现什么。
  • 你能发布一些代码吗?看起来在某处您有一个有条件地指定标签的组件,但条件为空,例如:[(when condition :div) "ok"] 在您运行它的上下文中为假。我会查看所有组件引用以检查您是否没有可能丢失它们的情况。
【解决方案2】:

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

ProxyPassReverse /api http://0.0.0.0:3001/api
ProxyPass /api http://0.0.0.0:3001/api

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

【讨论】:

  • 幸运的是,我的 /api 没有问题。它始终如一地返回应有的结果,即使页面没有呈现。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2016-01-05
    • 2014-11-22
    • 1970-01-01
    • 2019-05-14
    • 2011-08-21
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多