我有Angular 4应用程序,当用户提供电子邮件并单击忘记密码时,我将重置密码链接发送到我的电子邮件。当用户点击电子邮件中的链接时,它应直接进入ResetPassword或登录屏幕。但是,当我点击电子邮件中的链接时,它会给我404错误,而不是将用户带到指定页面(即www.mywebsite.com/ResetPassword?token=token123)。
我已经为ResetPassword等定义了路由。
{ path: 'ResetPassword', component: ResetPasswordComponent }
我是否需要配置角度4应用中的特定内容,以便在点击电子邮件中的链接时直接进入ResetPassword页面?为什么它给我404错误?
提前致谢。
答案 0 :(得分:0)
您需要将Web服务器配置为在找不到所请求的资源时返回index.html
文件,以便Angular可以加载并接管以获取该路由。如果您无法对其进行配置,则需要配置Angular以使用HashLocationStrategy
来表示URL。这会创建如下所示的网址:www.mywebsite.com/#/login
。
答案 1 :(得分:0)
以下两个步骤解决了我的问题,希望它可以帮助某人:
1)我刚注意到我定义的ResetPassword的路由是在'**'之后(404 - 未找到)。
因此,每当它试图找到ResetPassword时,它会发现在ResetPassword之前找不到404。
当我更改路由模块以在'**'之前定义ResetPassword时,我能够直接从电子邮件链接打开ResetPassword页面。
{ path: 'ResetPassword', component: ResetPasswordComponent }, // Define this one first prior to ** - 404 not found
{ path: '**', component: PageNotFoundComponent } // otherwise redirect to 404-Page Not Found
上一个代码:
{ path: '**', component: PageNotFoundComponent }
{ path: 'ResetPassword', component: ResetPasswordComponent }, // Never reached here as I got 404 prior to reaching this route
但是,这只适用于localhost。当我将代码部署到托管服务器时,它需要在步骤#2下面使其工作。
2)在托管服务器上,我必须使用以下设置更新web.config文件,以将所有路由重定向到root或index.html。
<system.webServer>
<rewrite>
<rules>
<clear />
<rule name="Redirect to https" stopProcessing="true">
<match url="(.*)" />
<conditions>
<add input="{HTTPS}" pattern="off" ignoreCase="true" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
</rule>
<rule name="AngularJS Routes" stopProcessing="true">
<match url=".*" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
</conditions>
<action type="Rewrite" url="/" />
</rule>
</rules>
</rewrite>
</system.webServer>
感谢@ guilherme-teubl,了解有关web.config设置的以下帖子的详细信息:
感谢Danial的回复!
答案 2 :(得分:0)
如果您使用的是Apache,请添加一个.htaccess
文件,其中应包含以下内容:
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . index.html [NC,L]
解决问题。