1

我正在编写一个带有单页网络应用程序的网站(网站的其余部分只是提供的静态文件)。我正在尝试为 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);
});

但这对我来说很愚蠢,原因很明显。

4

2 回答 2

3

最后,我使用这个中间件在适当的时候为应用程序的页面提供服务

// 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();
    }
});

然后我设置了一个baseHTML 元素,其href属性指向根。

于 2013-10-04T00:25:56.387 回答
0

如果您仍在尝试完成此操作,我可能已经找到了一个起点。Alexander Beletsky 有一个 Backbone.js + Express SPA 样板 repo位于 Here

有关它是如何产生的简短文章,您可以阅读他关于Dzone的文章。

于 2013-09-01T09:58:48.173 回答