如何将所有 Angular 请求重定向到 Nginx 中的 index.html
Posted
技术标签:
【中文标题】如何将所有 Angular 请求重定向到 Nginx 中的 index.html【英文标题】:How to redirect all Angular request to index.html in Nginx 【发布时间】:2016-05-04 10:49:58 【问题描述】:我已经创建了一个简单的 nginx 配置文件来像这样为 Angular 提供服务:
server
listen 80;
listen [::]:80;
root /path/to/apps/myapp/current/dist;
access_log /path/to/apps/myapp/current/log/nginx.access.log;
error_log /path/to/apps/myapp/current/log/nginx.error.log info;
index index.html;
location ^~ /assets/
gzip_static on;
expires max;
add_header Cache-Control public;
location /
try_files $uri $uri/ =404;
一切正常。因为我使用的是Angular UI Router,所以我想将所有页面转发到index.html
,这样Angular就会接管(所以对example.com/users/new
的请求将由Nginx重定向到index.html
,以便Angular UI处理它) 用于页面重新加载、链接等。
我怎样才能做到这一点?
我玩过以下选项:
server
#implemented by default, change if you need different ip or port
#listen *:80 | *:8000;
server_name test.com;
return 301 $scheme://www.test.com$request_uri;
如this 答案中所述。但我无法根据所有请求进行类似的工作。
我们将不胜感激。
【问题讨论】:
【参考方案1】:你几乎得到它。 try_files 是正确使用的文件,正如 Richard 所示,您只需将 index.html 添加到列表中。不过后面的=404就不用去掉了,其实最好不要去掉。
location /
try_files $uri $uri/ /index.html =404;
实施上述更改后,使用 sudo nginx -s reload
为什么 =404?
如果一切顺利,最后一个永远不会使用,并且路由只会尝试文件、文件夹、角度应用程序。就是这样。但我认为将 =404 放在末尾以涵盖所有基础是一种很好的做法。
关于 index.html 的重要说明
无论您是否在 try_files 中使用 =404,通过将所有内容定向到 index.html,您基本上都无法从您的网络服务器提供 404 错误,除非 index.html 不存在(这就是 @987654325 @ 进来)。这意味着您将需要在 Angular JS 中处理“未找到”的 url 和丢失的页面,并且您需要接受您使用的错误页面将返回 HTTP 200 响应而不是 404 的事实。(这是因为在您指向 index.html 的那一刻,您已经向用户提供了一个页面,因此是 200)。
为了更加放心,谷歌 try_files angular js 你会发现大多数例子都包含 =404。
参考资料:
http://nginx.org/en/docs/beginners_guide.html#control http://ajbogh.blogspot.ca/2015/05/setting-up-angularjs-html5-mode-in.html(仅举一个例子)【讨论】:
【参考方案2】:您需要将路由器添加到 try_files
指令的末尾,如下所示:
location /
try_files $uri $uri/ /index.html;
请参阅this document 了解更多信息。
【讨论】:
不幸的是,这不起作用。当我尝试重新加载页面或点击链接时,我得到了 404 这个行得通,他可能只需要重启nginx。 我想说你最后也需要 =404,作为最后的后备 @redfox05 Try_files 只能接受一个默认操作作为最后一个参数。使用响应代码或 URI,而不是同时使用两者。请参阅添加到我的答案中的链接。 我想你误解了我的意思。最后的 =404 是最后的后备。它将依次尝试每个选项,如果成功则不再进一步。最好用一个例子来解释。我会添加它作为答案。以上是关于如何将所有 Angular 请求重定向到 Nginx 中的 index.html的主要内容,如果未能解决你的问题,请参考以下文章
如何将所有路由重定向到nest.js中的index.html(Angular)?