如何使用ProxyPass通过Express提供静态文件?

时间:2014-03-17 06:35:50

标签: node.js apache express reverse-proxy mod-proxy

我使用Apache与mod_proxy一起使用Express,

来为我的Node应用程序提供服务
ProxyPass /nodeapp http://localhost:3000/
ProxyPassReverse /nodeapp http://localhost:3000/

但是从错误的地方请求静态JS和CSS。

例如,我想要来自

的CSS
http://homepage/nodeapp/css

但它是从

请求的
http://homepage/css

1 个答案:

答案 0 :(得分:4)

我通过使用HTML" Base"在我的环境中解决了这个问题。在我的应用程序的index.html中标记,然后确保我的应用程序中的所有链接都是相对的。这有助于确保浏览器请求适当的路径。

值得注意的是,由于我的应用程序是SPA(单页应用程序),因为实际导航始终位于根目录,所有资产始终有效。

在您的情况下,标记(在<head>元素内)可能如下所示:

<base href="/nodeapp/">

我对应的Apache配置过于简单:

<Location /nodeapp>
  ProxyPass http://127.0.0.1:9000
  ProxyPassReverse http://127.0.0.1:9000

  # other Apache directives here
</Location>

我的应用程序恰好使用AngularJS,我可以访问&#34; root&#34;使用#字符的应用程序。例如,如果我想转到/settings(生产中为/nodeapp/settings),我会将#settings指定为任意链接的href。您的里程可能会有所不同,如果您使用的是AngularJS并且调整html5Mode设置以查看哪种方法最适合您的部署,那么肯定值得查看https://docs.angularjs.org/guide/ $位置。

我没有必要教Express关于它的mountpoint,因为浏览器使用上面的<base>标记请求适当的资源,并且ProxyPass/ProxyPassReverse Apache指令在处理之前适当地剥离/nodeapp快到快递。

虽然我没有触及Express&#39;路由器(以上)了解以下内容可能仍然有用。如果您使用的是Express 4.x,那么&#34;安装&#34;据称,Express应用程序比以前版本的Express更容易。这里有一些很好的例子:https://github.com/visionmedia/express/wiki/New-features-in-4.x

从该页面开始:

  

想象一下你项目中的一个例子routes / people.js。

var people = express.Router();

people.use(function(req, res, next) {
});

people.get('/', function(req, res, next) {
});

module.exports.people = people;
     

您可以将它安装在/ people路径下,以便对/ people / *的任何请求都会路由到人员路由器。

app.use('/people', require('./routes/people').people);

该页面还会引导您进入Express 4.x路由器API: http://expressjs.com/4x/api.html#router

但是,如果您使用Apache的ProxyPass重新编写入站请求,通常不需要这种技术。

如果您的应用程序不是SPA,您可能会发现运气使用mod_proxy_html进行动态内容重写。我在这方面取得了有限的成功,但AngularJS最终并不喜欢它。但是,我认为它可能适合不同的应用程序。

如果您选择使用mod_proxy_html,则可以查看StackOverflow问题&amp;在此处获取更多信息:ProxyHTML to rewrite URL