【发布时间】:2010-12-27 17:54:38
【问题描述】:
我正在构建一个带有独立 HTTP 服务器的应用程序,该服务器可以直接访问,也可以放在反向代理后面(如 Apache mod_proxy)。
所以,假设我的应用程序在端口 8080 上运行,而您这样设置 Apache:
ProxyPass /myapp http://localhost:8080
ProxyPassReverse /myapp http://localhost:8080
这将导致进入主 Apache 服务器并转到 /myapp/* 的 HTTP 请求被代理到我的应用程序。如果像GET /myapp/bar 这样的请求进来,我的应用程序将看到GET /bar。这是应该的。
出现的问题是生成的 URI 必须从我的应用程序的 URI 空间转换才能通过代理正常工作(即预先添加 /myapp/)。
ProxyPassReverse 指令负责处理 HTTP 标头中的 URI(重定向等)。但这不处理我的应用程序生成的 HTML 或静态文件和模板中的 URI。
我知道像 mod_proxy_html 这样的过滤器,但这是一个非标准的 Apache 模块,无论如何,这些过滤器可能不适用于其他能够充当反向的前端 Web 服务器代理。
所以我想出了一些可能的策略:
要求在某处设置包含代理路径的环境变量,并将其添加到所有生成的 URI。这似乎不优雅;它破坏了反向代理提供的封装。
将代理路径放入我的应用程序的配置文件中。反对同上。
在我的应用程序中仅使用相对 URI。这可能会有些棘手。我必须计算当前资源与链接所在位置之间的路径差异,并添加适当数量的
../'es。看起来很乱另一个问题是有些东西必须生成绝对 URI,例如 RSS 提要和生成的电子邮件。在前端使用一些 hacky Javascript 来混合文档文本中的 URI。从互操作性的角度来看,这似乎是一个非常可怕的想法。
在我的代码中使用单一的 URI 生成函数,并要求 Javascript、CSS 等“静态”文件在我的模板系统中运行。这是我现在倾向于的想法。
这一定是一个相当普遍的问题。你过去是如何处理它的?什么有效,什么让事情变得更加困难?
【问题讨论】: