我正在编写一个带有单页网页应用程序的网站(网站的其余部分只是提供的静态文件)。我正在尝试编写一个用于Express的中间件,以将所有遵循模式'example.com/app'的请求重定向到'example.com/app',以便请求诸如'example.com/app/my/specific/ page /'将导致同一页面被发送。这个问题的关键问题是浏览器地址栏中的url不能更改,以便javascript应用程序本身可以解释它并显示正确的内容。
我本可以做这样的事情:
app.use( '/app', function ( req, res ) {
res.redirect('/app');
});
但是,这会导致页面的url发生更改,并且假定会发出单独的HTTP请求。
最明显的替代解决方案是做这样的事情:
app.use( '/app', function ( req, res ) {
res.sendfile(__dirname + '/public/app/index.html');
});
这里的问题是,像'example.com/app/my/specific/page/'之类的请求后页面中的资源会显示在错误的位置。例如,如果我在页面上有图像,那么它将查找example.com/app/my/specific/page/image.jpg。由于没有返回图像,因此不会在页面上显示。所有外部脚本或样式表都会发生这种情况。
我也试过这样的事情:
app.use( '/app', function ( req, res ) {
res.sendfile(__dirname + '/public/beta' + url.parse(req.url).pathname);
});
但由于显而易见的原因,这对我来说非常愚蠢。
答案 0 :(得分:2)
最后,我使用此中间件在适当的时候提供应用页面
// all unmatched requests to this path, with no file extension, redirect to the dash page
app.use('/dash', function ( req, res, next ) {
// uri has a forward slash followed any number of any characters except full stops (up until the end of the string)
if (/\/[^.]*$/.test(req.url)) {
res.sendfile(__dirname + '/public/dash/index.html');
} else {
next();
}
});
然后我设置了一个base
HTML元素,其中href
属性指向根。
答案 1 :(得分:0)
如果你还在努力实现这个目标,我可能已经找到了一个起点。 Alexander Beletsky有一个Backbone.js + Express SPA样板回购Located Here。
有关如何发表的简短文章,您可以阅读他在Dzone上的文章。