如何在Nginx中将所有Angular请求重定向到index.html

2024-03-10

我创建了一个简单的 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 路由器 https://github.com/angular-ui/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 https://stackoverflow.com/questions/10294481/how-to-redirect-a-url-in-nginx回答。但我无法根据所有要求进行类似的工作。

如有建议,我们将不胜感激。


你已经快明白了。 try_files 是正确的使用方法,正如 Richard 所示,您只需将 index.html 添加到列表中即可。不过,没有必要去掉末尾的=404,事实上,最好不要去掉。

location / {
    try_files $uri $uri/ /index.html =404;
}

实施上述更改后,重新加载配置sudo nginx -s reload

  • $uri将尝试将请求作为文件,如果失败,它将移动到 下一个。
  • $uri/将尝试将请求作为文件夹 /index.html 将 然后尝试,它将所有请求发送到您的index.html,其中您的 角度应用程序将能够路由事物(还要确保您使用 html5mode 避免在 url 中使用#。
  • =404将是你最后的后备,基本上是说:我已经尝试过将其作为文件、文件夹和通过index.html。如果index.html失败/没有 无论出于何种原因存在,我们都会提供 404 错误。

为什么=404?

如果一切顺利,最后一个永远不会被使用,路由只会尝试文件、文件夹、角度应用程序。就这样了。但我认为最后加上 =404 来涵盖所有基础是一个很好的做法。

关于index.html catchall 的重要说明

无论您是否在 try_files 中使用=404,通过将所有内容都定向到index.html,您基本上失去了从网络服务器提供404错误的能力,除非index.html不存在(这是在哪里)=404进来)。这意味着您需要在 Angular JS 中处理“未找到”url 和缺失页面,并且您需要接受这样一个事实:您使用的错误页面将返回 HTTP 200 响应,而不是 404。(这是因为当您定向到index.html 时,您就已经向用户提供了一个页面,因此为200)。

为了对上述内容更加放心,请谷歌 try_files Angular js,您会发现大多数示例都包含 =404。

参考:

  • http://nginx.org/en/docs/beginners_guide.html#control http://nginx.org/en/docs/beginners_guide.html#control
  • http://ajbogh.blogspot.ca/2015/05/setting-up-angularjs-html5-mode-in.html http://ajbogh.blogspot.ca/2015/05/setting-up-angularjs-html5-mode-in.html(仅举一例)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Nginx中将所有Angular请求重定向到index.html 的相关文章

随机推荐

  • 排序比较计数器

    我有这段代码 可以对填充有随机数的数组进行排序 并计算完成排序所需的数字比较 我正在使用排序方法选择冒泡和合并排序 我有选择和气泡的计数器 但没有合并的计数器 我不知道把它放在哪里 这可能是一个简单的答案 但我就是无法让它发挥作用 Code
  • 使用 Winforms 应用程序部署 SQL Server 数据库

    我创建了一个基于 SQL DB 的 winforms 应用程序 我想将其部署在客户端计算机上 该程序是单用户桌面应用程序 意见于this https stackoverflow com questions 1813241 how to de
  • GitHub 从之前的提交中分叉了一个存储库

    我在 GitHub 上找到了一个存储库 我想分叉 但不是当前版本 我想分叉该存储库 因为它有相当多的提交回来 这可能吗 该存储库尚未标记任何版本 因此我不确定如何执行此操作 显然 我可以复制该提交中的代码 但我更愿意分叉 因为这样我就可以将
  • HBase 上的 Thrift 有性能基准吗?

    我有一个可以将大量数据写入 hbase 的系统 系统是用c 编写的 发现hbase有其他语言的thrift接口 我的问题是 HBase 上的 Thrift 有性能基准吗 与java原生api相比 最劣势是什么 我推荐最近关于这个主题的两篇博
  • PS 脚本正在导出空的 CSV

    我花了很长时间试图理解为什么这个脚本没有按预期工作 这是一个简单的脚本 我尝试在其中导入 CSV 选择我想要的几列 然后导出 CSV 并复制自身 基本上 我们已经存档了数据 由于内存大小限制 我只需要从另一个项目中获取几列 这个脚本非常简单
  • 在 Android Studio 上将模块或项目导入为库

    我想在我的动态壁纸项目中使用 HoloEverywhere HE Preferences AddOn 该项目即将完成 我只需要它从 android 2 3 到 4 4 看起来相同 所以我继续按照指南从 GitHub 获取 HE 在 Demo
  • 水豚无法使用 action_cable

    我正在使用带有操作电缆的 Rails 5 beta 3 集成在开发中运行良好 但是当我尝试通过水豚运行功能测试时 它似乎没有命中通道操作 我正在使用 Portergeist 并将 puma 配置为水豚的服务器 我还使用 es5 shim 和
  • 在 Windows 上调试时 stderr 去了哪里?

    当尝试在 Windows 上调试程序时 我似乎无法找到推送到 stderr 的输出的去向 如何获取 stderr 输出 是否可以更改调试器级别设置 MSVC 9 以将 stderr 重定向到 UI 的某些部分 更新 我还没有研究过TRACE
  • 在 Android 类相机中将自动对焦放在哪里

    我正在尝试使用自动对焦 我不知道在哪里放置自动对焦 有人知道如何实现自动对焦吗 预习班 package com marakana import java io IOException import android content Conte
  • 使用 Auth 获取数据透视表中用户的角色

    我有以下数据库结构 使用数据透视表连接用户和角色表 用户表包含所有信息 例如电子邮件和密码 而角色表定义不同的角色 角色表 1 gt 管理员 2 gt 编码器 3 gt 推销员 4 gt 技术 现在角色被定义为多对多 因为有一些编码器也被分
  • 从哪里可以获得 libpq 源代码?

    我想编写使用 Postgresql 作为 DBMS 的应用程序 要编写客户端应用程序 我需要 libpq 库和头文件吗 如果是的话我会在哪里获得 libpq 库和头文件 Libpq 包含在完整的 PostgreSQL 源代码中 您可以只使用
  • Java NIO ByteBuffer,翻转后写入

    我是 Java ByteBuffers 的新手 想知道翻转后写入 ByteBuffer 的正确方法是什么 在我的用例中 我将一个输出缓冲区写入套接字 outBuffer flip Non blocking SocketChannel int
  • 使用不带 src 属性的 vuejs 在 iframe 中渲染组件

    我想在这个 iframe 中渲染组件 是否有在 iframe 中创建 html 元素或渲染组件的选项 new Vue el frame store store router router render component 对我来说最简单的方
  • 本地化 Angular Material 日期选择器中的日期值

    我正在使用 Angular Material 日期选择器 我的问题是 当我向 Web Api 控制器发送日期时 我得到的日期小于我在表单中选择的日期 我认为这是因为日期值没有本地化 我想知道的是如何localize the date in
  • 嵌套 JSF 复合组件导致堆栈溢出异常

    问题 当我尝试将复合组件嵌套在其自身中 并使用一些逻辑来结束无限递归时 我收到堆栈溢出异常 我的理解是
  • 使用 TabLayout android 实现不同大小的选项卡

    尝试重新创建与 Instagram 相同的顶部 TabLayout 主选项卡 侧边标签 尝试过多种方法 应用程序 tabMode 固定 应用程序 tabMode 可滚动 我设法以编程方式创建它 如下所示 View view1 getLayo
  • 如何在Spring中创建非阻塞@RestController Web服务?

    我有一个 RestControllerwebservice 方法可能会阻止长时间运行的服务调用的响应线程 如下 RestController public class MyRestController could be another we
  • ggplot:以相反顺序堆叠条形图

    所以我有数据框 dput df structure list Frequency structure c 1L 2L 3L 4L 1L 2L 3L 4L Label c 2 3 4 5 class factor Prcentage c 1
  • 将 16 位 tiff 文件转换为可在线查看的文件?

    我需要获取 16 位 tiff 文件并使其可以在我的网站上查看 为了查看 tiff 文件 许多浏览器都需要插件 我找到了一个可以将它们转换为 jpg 文件的软件 但我想知道是否有一种方法可以独立完成此操作 我正在使用 Ruby on Rai
  • 如何在Nginx中将所有Angular请求重定向到index.html

    我创建了一个简单的 Nginx 配置文件来服务 Angular 如下所示 server listen 80 listen 80 root path to apps myapp current dist access log path to