app-routing.module 没有 useHash 会导致 500 错误

问题描述 投票:0回答:2

我正在设置一个带有路由的 Angular Web 应用程序:https://wei.insa-cvl.org

当我使用此应用程序内的链接时,我可以打开不同的页面。 例如,单击“Mot de passe oublié ?”链接将我带到了好页面:https://wei.insa-cvl.org/auth/forgot-password。 但是,当我尝试通过 URL 访问此页面时,出现内部服务器错误。

我认为问题来自

.htacess
文件,但即使我删除它,我总是收到此错误。

.htaccess
文件(来源

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
    RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
    RewriteRule ^ - [L]

    RewriteRule ^ /index.html
</IfModule>

路线:

{path: '', component: ApplicationComponent, canActivate: [AuthGuardService]},
{path: 'auth', component: AuthComponent},
{path: 'auth/forgot-password', component: ForgotPasswordComponent}
...
{path: '**', redirectTo: '/auth', pathMatch: 'full'}

我想通过 URL 访问页面,而不仅仅是单击“应用内链接”。可能吗?

编辑:万岁,我终于找到了解决方案!我必须将

{useHash: true}
添加到我的
app-routing.module.ts
并使用哈希 URL,如下所示:https://wei.insa-cvl.org/#/policy 但我不明白,为什么??

angular http redirect error-handling
2个回答
1
投票

万岁,我终于找到了解决方案!我必须将 {useHash: true} 添加到我的 app-routing.module.ts 并使用哈希 URL,如下所示: https://wei.insa-cvl.org/#/policy 但是我不明白,为什么??

这是因为哈希值和后面的内容没有发送到服务器。在你的例子中,它是有效的,因为 Angular 将哈希策略性地放在主机名之后,这样,当用户手动更改 URL 时,浏览器将只获取域名并在你的网络服务器将收到的请求中使用它,并且因为未指定文件,将回复关联的默认文件,通常是

index.html

尽管这种方法在大多数情况下都是有效且有效的,但您可以像您尝试的那样以不同的方式处理这种情况。在您的网络服务器中,对于每个 404 请求(意味着您的网络服务器不知道路由),您可以使用

200
index.html
进行回复,并让 Angular 应用程序在内部处理路由,或者如果您正在使用网络服务器对于 Angular 应用程序,您可以随时返回
index.html
文件。

我假设您使用 Apache 作为网络服务器,请检查此 StackOverflow 以获得更多帮助。

将此配置添加到网络服务器允许您使用Angular Universal,它允许您从服务器渲染模板,从而加快页面加载速度。


0
投票

当您请求 URL 时

https://wei.insa-cvl.org/#/policy

您实际上请求的是以下 URL:

https://wei.insa-cvl.org/index.html#/policy

查看

index.html
文件?

由于

index.html
是托管 Angular 应用程序的文件,因此会执行 Angular 代码,并且 Angular 可以处理 URL 的主题标签片段:
#/policy
。一切正常!

如果您不使用主题标签并直接请求 https://wei.insa-cvl.org/policy,您的服务器会尝试查找名为

policy
的文件或文件夹,但它不存在并且请求失败(错误500)。

解决方案是将您的服务器配置为将所有请求重定向到

index.html
文件,以便您的 Angular 应用程序可以执行。

看起来您正在使用 Apache。我发现以下代码将所有请求重定向到

index.html
(来源:https://serverfault.com/a/188411):

RewriteEngine on
RewriteCond %{REQUEST_URI} !^/index.html$
RewriteRule . /index.html [R=302,L]
© www.soinside.com 2019 - 2024. All rights reserved.