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

我使用mod_proxy Apache来为我的Node应用程序提供Express,

ProxyPass /nodeapp http://localhost:3000/
ProxyPassReverse /nodeapp http://localhost:3000/

但是静态JS和CSS正在被请求来自错误的地方。

例如,我想要CSS

http://homepage/nodeapp/css

但它正在被要求

http://homepage/css

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

值得注意的是,由于我的应用程序是一个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,我可以通过使用#字符来获取应用程序的“根”。 例如,如果我想去/settings (这将是生产中的/nodeapp/settings ),我会指定#settings作为任何给定链接的href 。 您的里程可能会有所不同,如果您使用的是AngularJS并且无法使用html5Mode设置来查看最适合您的部署的情况,那么肯定值得查看https://docs.angularjs.org/guide/$location。

由于浏览器正在使用上面的<base>标签请求适当的资源,并且ProxyPass/ProxyPassReverse Apache指令在将其交付给Express之前适当地剥离/nodeapp ,因此我不必向Express教授关于它的挂载点。

虽然我不需要触摸Express'路由器(按上述),但了解以下内容仍然有用。 如果您使用的是Express 4.x,则“安装”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的问题和答案以获取更多信息:ProxyHTML重写URL

链接地址: http://www.djcxy.com/p/78269.html

上一篇: How to use ProxyPass to serve static files through Express?

下一篇: openCV AdaptiveThreshold versus Otsu Threshold. ROI