如何使用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
上一篇: How to use ProxyPass to serve static files through Express?