backbone.js 在node.js中为所有传入的http请求提供index.html

fhity93d  于 2022-11-10  发布在  Node.js
关注(0)|答案(2)|浏览(155)

我有一个这样的节点服务器:

var express = require('express');
var fs = require('fs');
var path = require('path');

var root = fs.realpathSync('.');

var app = express();
app.configure(function () {
    app.use(express.static(__dirname + '/./'));
    app.use(app.router);
});
app.get('/*', function (req, res) {
    res.sendfile(path.join(root, './index.html'))
});
/*app.get('/dashboard', function (req, res) {
    res.sendfile(path.join(root, 'index.html'))
});*/

app.listen(3000);
console.log('Listening on port 3000');

在前端,我使用 Backbone.js 路由通过HTML历史API来路由应用程序模块。因此它总是一个格式良好的URL。当我刷新页面时出现问题。它在本地节点服务器上工作正常,但当我在Microsoft Azure Cloud上部署应用程序时,刷新产生了一个问题,它说,它找不到资源。
我需要对Azure进行哪些特定的配置,以使其了解它应该为新请求提供index.html,而不是查找资源?
在apache中,我们使用.htaccess来实现这一点,但我不知道如何在azure cloud上实现这一点!

ukdjmx9f

ukdjmx9f1#

找到了解决办法:
你需要在根目录下有一个webconfig文件,这样才能正常工作。Azure内部只有IIS来提供这些文件。如果你仔细观察,一旦你部署了应用程序,server.js就没有用了。IIS会控制为index.html文件提供服务,因此你需要在IIS配置中做一些事情。下面是你需要放在应用程序根目录下的Web.config(区分大小写)文件:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.webServer>
     <rewrite>
             <rules>
                 <rule name="redirect all requests" stopProcessing="true">
                     <match url="^(.*)$" ignoreCase="false" />
                     <conditions logicalGrouping="MatchAll">
                         <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" pattern="" ignoreCase="false" />
                     </conditions>
                     <action type="Rewrite" url="index.html" appendQueryString="true" />
                 </rule>
             </rules>
         </rewrite>
    </system.webServer>
</configuration>
xzv2uavs

xzv2uavs2#

您可以尝试使用一个通用的中间件,而不是一个特定于方法的路径:

app.use(function (req, res) {
  res.sendfile(path.join(root, './index.html'));
});

据我所知,Express目前不支持特定于方法的中间件(例如app.get(function(req, res) { ... }))。
还有一个不相关的注意事项,var root = fs.realpathSync('.');是不必要的,因为全局__dirname应该得到相同的值。

相关问题