nginx 部署单页应用程序Angular :404页面未找到

6psbrbz9  于 2023-01-12  发布在  Nginx
关注(0)|答案(9)|浏览(202)

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

  1. cf推送名称-应用程序-不启动
  2. cf开始名称-应用程序
    应用运行良好。我有一个导航栏,所以当我用导航栏改变路径时一切都很好。但当我手动操作时(我自己输入网址),我有这个错误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');
  }
}
xe55xuns

xe55xuns1#

对于那些不使用静态文件的人,可能想试试这个。
我在使用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;
    }
fumotvh3

fumotvh32#

nginx.conf文件中尝试使用:

try_files $uri $uri/ /index.html;

而不是:

try_files $uri $uri/ =404;

这对我的Angular 5项目工作。

dfty9e19

dfty9e193#

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

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

启用pushstate可使服务于多个路由的客户端JavaScript应用程序的浏览器可见URL保持干净。例如,pushstate路由允许将单个JavaScript文件路由到多个锚点标记的URL,这些URL类似于/some/path 1而不是/some#path1。

kq0g1dla

kq0g1dla4#

我假设/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
dy2hfwbg

dy2hfwbg5#

这是服务器端的问题,而不是Angular 方面的问题。在您的情况下,返回每个请求的索引或登录页是服务器的责任。

    • 更新**

无论如何,如果您没有后端或服务器,您可以配置这有两个变通办法。

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

qf9go6mv6#

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

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

所以我给nginx用户包含我的dist的顶层文件夹权限

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

然后你必须重启nginx

sudo systemctl restart nginx

而且它应该起作用!

cld4siwp

cld4siwp7#

Angular 应用程序是单页应用程序。当您手动键入地址时,您会尝试路由到应用程序未运行的位置。
您需要编辑nginx配置来路由到您的基本页面。

wribegjk

wribegjk8#

这实际上是一个nginx配置问题,接下来需要克服这个问题。
在nginx. conf文件中尝试使用:
文件名为$uri $uri//索引. html;
而不是:
用户名:$uri/= 404;
那么以后还需要改一下.
发件人:

error_page 404 index.html;

error_page 404 /actualPathToDistFolder/index.html;
cwtwac6a

cwtwac6a9#

如果您正在将Angular 应用程序部署到S3,则需要设置Error Document并将文档索引到index.html,并清空重定向规则(/properties/static website)x1c 0d1x

相关问题