将 nginx 404 重定向到 angular 路由 /#/404

Redirect nginx 404 to angular route /#/404

我有一个 angular 应用程序,它使用 angular-ui $stateProvider$urlRouterProver

我的 angular 路由器相应地重定向到我的 404 状态;

$urlRouterProvider.when('', '/').otherwise('404');
$stateProvider.state('404', {
  url: '/404',
  templateUrl: 'partials/404.html',
  controller: 'PageCtrl'
});

此 404 的最终 url 看起来像 http://<snip>.com/#/404。这工作得很好,它处理错误的 urls 匹配 /#/whatever/missing/ 但它没有覆盖 /wrong/url/.

Root 404 由 nginx 的 error_page 处理。我尝试了一些 error_page 404;

的组合
error_page 404 /#/404;
location = /#/404 {
  root /var/www/<snip>.com/public/;
  internal;
}

nginx 日志输出:

[error] open() "/var/www/<snip>.com/public/#/404" failed (2: No such file or directory), request: "GET / HTTP/1.1"

并且它不会重定向到 angular 的 404 状态(并且不会更改 url)。

仔细研究和阅读文档后,我们可以直接使用带有 error_page 的重定向。我的 nginx 解决方案如下所示:

location / {
  root  /var/www/<nip>.com/public/;
  error_page 404 =301 http://<snip>.com/#/404;
}

我不太喜欢重定向解决方案,但它似乎不会破坏后退按钮的任何内容,所以我可以接受。 :)