【问题标题】:Deploy single page application Angular: 404 Not Found nginx部署单页应用 Angular: 404 Not Found nginx
【发布时间】:2018-02-02 04:18:09
【问题描述】:

我有一个 Angular 应用程序。我运行命令ng build --prod --aot 来生成 dist 文件夹。 在 dist 文件夹中,我创建了一个名为 Staticfile 的文件,然后我使用以下命令将 dist 文件夹上传到 pivotal.io

  1. cf push name-app --no-start
  2. cf start name-app

应用程序运行良好。我有一个导航栏,所以当我使用导航栏更改路径时,一切正常。但是当我手动操作时(我自己输入 url)我有这个错误404 Not Found nginx。 这是我的 app.component.ts:

const appRoutes: Routes = [
  { path: 'time-picker', component: TimePickerComponent },
  { path: 'material-picker', component: MaterialPickerComponent },
  { path: 'about', component: AboutComponent },
  { path: 'login', component: LoginComponent },
  { path: 'registration', component: RegistrationComponent },
  {
    path: '',
    redirectTo: '/time-picker',
    pathMatch: 'full'
  }
];

@NgModule({
  declarations: [
    AppComponent,
    TimePickerComponent,
    MaterialPickerComponent,
    DurationCardComponent,
    AboutComponent,
    LoginComponent,
    RegistrationComponent,
  ],
  imports: [RouterModule.forRoot(
    appRoutes
    // ,{ enableTracing: true } // <-- debugging purposes only
  ),
    FormsModule,
    BrowserAnimationsModule,
    BrowserModule,
    MdCardModule, MdDatepickerModule, MdNativeDateModule, MdInputModule

  ],
  providers: [{ provide: DateAdapter, useClass: CustomDateAdapter }],
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(private dateAdapter: DateAdapter<Date>) {
    this.dateAdapter.setLocale('fr-br');
  }
}

【问题讨论】:

标签: angular nginx single-page-application angular-routing cloud-foundry


【解决方案1】:

我假设您的/dist 目录的所有数据现在都在/var/www/your-domain/ 中,如果不是,请先粘贴到那里

现在您的网址仅被接受主页或登录页面,否则它们会显示 404 错误。

在这种情况下找到你的ngnix的/default文件,在Linux路径中/etc/nginx/sites-available/default,在这个文件中,你会看到这样的

try_files $uri $uri/ =404

替换为

try_files $uri $uri/ /index.html;

现在您在 linux 中使用命令重新启动您的 ngnix 服务器

sudo systemctl restart nginx

查看 ngnix 的状态

sudo systemctl status nginx

【讨论】:

    【解决方案2】:

    这实际上是一个 nginx 配置问题,需要解决这个问题。

    在你的 nginx.conf 文件中尝试使用:

    try_files $uri $uri/ /index.html;

    代替:

    try_files $uri $uri/ =404;

    那么之后还需要更改以下内容。

    来自:

     error_page 404 index.html;
    

    error_page 404 /actualPathToDistFolder/index.html;
    

    【讨论】:

      【解决方案3】:

      我终于找到了答案: 在我生成 dist 文件夹之后。

      • 我创建了一个名为 Staticfile 的文件并将其放在 dist 文件夹中
      • 我打开 Staticfile 并添加了这一行 pushstate: enabled

      pushstate 启用可让浏览器可见的 URL 保持干净,以便为提供多个路由的客户端 JavaScript 应用程序提供服务。例如,pushstate 路由允许单个 JavaScript 文件路由到多个带有锚标记的 URL,这些 URL 看起来像 /some/path1 而不是 /some#path1。

      【讨论】:

      • 我遇到了完全相同的问题,但这对我没有用,知道我会错过什么吗?我在 angular8 上
      【解决方案4】:

      对我来说这是一个权限问题,Nginx 必须是您放置 dist 的目录的所有者,我在 nginx 日志文件中看到了这个错误

      "root/../../dist/index.html" failed (13: Permission denied)
      

      所以我在包含我的 dist 的顶级文件夹中授予 nginx 用户权限

      chown nginx . -R //  to give nginx the permissions on the current directory, and everything in it.
      

      然后你必须重新启动 nginx

      sudo systemctl restart nginx
      

      它应该可以工作!

      【讨论】:

      • 在我一切都失败后,我看到了你的答案,意识到我必须重新启动 nginx
      【解决方案5】:

      在您的nginx.conf 文件中尝试使用:

      try_files $uri $uri/ /index.html;
      

      代替:

      try_files $uri $uri/ =404;
      

      这在 Angular 5 项目中对我有用。

      【讨论】:

      • 这正是@Marko Letic 所说的。这个答案有什么不同?
      【解决方案6】:

      对于那些不使用 Staticfile 的人可能想试试这个。

      我在使用 nginx 服务 Angular 时遇到了同样的问题。 以下是默认配置文件,可能在 /etc/nginx/sites-available/yoursite 中的某处找到

           location / {
                  # First attempt to serve request as file, then
                  # as directory, then fall back to displaying a 404.
                  try_files $uri $uri/ =404;
          }
      

      但我们真正想要的是……

           location / {
                  # First attempt to serve request as file, then
                  # as directory, then redirect to index(angular) if no file found.
                  try_files $uri $uri/ /index.html;
          }
      

      【讨论】:

      • 是的,你是对的。这种方法也有效。但就我而言,我使用的是 PaaS 的 PWS,所以它无法工作。 +1 虽然它可以在未来帮助人们
      • 嗨,我真的很困惑如何为我的 react 应用程序实际访问 /etc/nginx/sites-available/yoursite。请帮忙。
      • @John,如果您使用的是基于 Unix 的操作系统,并且 ofc 正在使用 nginx,则此路径是找到 nginx 配置的位置。您是这种情况吗?
      • 我在 Windows 机器上@Sven。我如何到达该地点?有什么想法吗?
      【解决方案7】:

      这是服务器端的问题,而不是 Angular 端的问题。在您的案例nginx 中,为每个请求返回索引或登录页面是服务器的责任。

      更新

      如果您无论如何都没有可以配置的后端或服务器,则有两种解决方法。

      • 在 Angular 中使用 HashLocationStrategy
      • 对 index.html 文件进行一些调整 link 否 -15

      【讨论】:

      • 如果您不想通过 nginx 配置方式,我有一个解决此问题的方法,但请注意这是一个严格的解决方法 link 检查问题 15 [最后一个]
      • 我已经告诉过您,先生,我所做的只是创建一个 Angular 应用程序。我没有在后端做任何工作
      • 这仅适用于前端,请查看评论中的链接先生。您需要在 index.html 中进行更改。我也会更新答案
      • @Melchia 希望你现在得到它
      • 我不明白,我访问过你的网站什么都没有
      【解决方案8】:

      Angular 应用程序是单页应用程序。当您手动键入地址时,您会尝试路由到应用程序未运行的位置。

      您需要编辑 nginx 配置以路由到您的基本页面。

      【讨论】:

      • 我没有 nginx 配置,我做的唯一步骤就是我上面写的那些。我只是添加了一个静态文件,然后推送了 dist 文件夹。
      • 如何为 pivotal.io 配置 nginx。我没有服务器端,我所做的只是在前端。
      猜你喜欢
      • 1970-01-01
      • 2016-11-11
      • 2014-03-11
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2021-07-25
      • 2021-09-15
      • 1970-01-01
      相关资源
      最近更新 更多