所以我几乎已经阅读了这个主题的每个答案/问题,但我脑子里还有很多问题。
首先,问题是:
我有一个启用了html5的AngularJS应用程序,所以我可以摆脱'#'登录。
$locationProvider.html5Mode({ enabled: true, requireBase: true });
$locationProvider.hashPrefix('!');
这是我 index.html 中的重要部分:
<!DOCTYPE html>
<html ng-app="application" ng-controller="ApplicationController as app">
<head>
<meta name="fragment" content="!">
<title>LivingRoomArt</title>
<meta charset="UTF-8">
<base href="/index.html" />
我正在与使用express的 NodeJS服务器进行通信:
router.route('/events')
.post(authController.isAuthenticated, eventController.postEvent)
.get(eventController.getEvents);
// Register all our routes with /api
app.use('/api', router);
// Start the server
app.listen(process.env.PORT || 5000);
所以,通常的问题是:
重新加载后,我从服务器获得404。我在这里得到了这个概念,到处都是建议的解决方案:
// This route deals enables HTML5Mode by forwarding missing files to the index.html
app.all('/*', function(req, res) {
res.sendfile('index.html');
});
});
问题是,我的服务器上没有index.html文件,也没有 我想在我的服务器上复制它。
那么如何在不在我的服务器上存储html文件的情况下告诉Node正确处理请求?
如果有帮助,我将在Heroku上托管Node应用程序。
答案 0 :(得分:1)
当您说您不提供静态文件时,您是说node.js API不对吗?
我猜你最终得到了两个截然不同的网址,我们称之为http://api.com
和http://client.com
。
我不明白为什么您的API应该处理404.您是否在浏览器中加载http://api.com
并期待index.html
?如果它确实是您的用例,我建议在您的API中声明一个简单的路由,如:
app.all('/*', function (req, res) {
res.redirect('http://client.com');
});
将所有未被您之前的路线声明捕获的请求重定向到您的客户网站。
然后,有两个选项:
如果服务静态文件的服务器是使用express的另一台Node.Js服务器,那么您可以完美地执行sendfile
,因为您现在可以访问index.html
如果您正在使用Nginx(我强烈建议您不要使用静态),您可以执行这样的配置,将所有失败的请求(丢失的文件/路由)重定向到{ {1}}
index.html