【发布时间】:2017-01-09 11:38:10
【问题描述】:
我正试图弄清楚如何在我的 AngularJS 应用程序上为未找到的页面获取 404 文档状态错误,以保持良好的 SEO。我想做类似于 Red Bull Sound Select 网站的做法,但我不确定他们是如何做到的?
示例 404 网址
https://www.redbullsoundselect.com/no-page-here
正如您在上面的示例中看到的,URL 更改为 /404,并且您会收到 URL 中原始路径的 404 文档状态错误,即 no-page-here
在我的 AngularJS 应用中,我只有:
.otherwise({
class: 'page-not-found',
title: '404 Page Not Found',
description: '404 Page Not Found',
templateUrl: '/app/static/404.html',
controller: 'mainController as mainCtrl'
});
我可以使用类似的东西:
otherwise({
redirectTo: '/404'
});
这与 redbull 网站的类似,但它仍然没有给出 404 文档状态错误。 (还将 URL 更改为 404 而不是保留原始 URL,这对 SEO 也不是很好,但至少错误的 URL 不会被 Google 索引。)
我想我可以尝试在 Angular 中发出一个不存在的 http 请求以获得 404 xhr 状态,但我认为这还不够。
我读过一些建议使用 prerender.io 的 answers,但这是您必须支付的费用,这似乎有点多只是为了让 404 页面正常工作。
也许,我们可以在 .htaccess 中做些什么来以不同的方式处理 404 页面?目前我们已经重写规则,以便任何不存在的请求资源都将使用/index.html。也许我们可以对 Apache 处理 404 页面的方式例外。
更新
我在 redbullsoundselect.com 上发现他们在 app.js 中使用以下内容
$stateProvider.state("404", {
url: "/404",
templateUrl: "/views/site/404.html",
controller: "NotFoundController"
});
虽然,我仍然不明白这个逻辑是如何运作的。我查看了他们的NotFoundController,但其中似乎没有发生太多事情。
像我这样使用ui.router 而不是ngRoute 可能与他们有关吗?
第二次更新
这是我的.htaccess 设置:
RewriteEngine On
# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]
# 如果请求的资源不存在,使用 index.html 重写规则 ^ /index.html
【问题讨论】:
-
虽然 AngularJS 及其包含的路由由客户端处理,但您不能使用 AngularJS 返回
404 not found。那是你已经建议的。当然,您可以创建一个.htaccess文件并为所有未配置的 AngularJS 路由返回 404。在您的客户端应用程序中配置 AngularJS 的路由时,您需要手动或使用自定义脚本管理.htaccess中的 URL。 -
@lin 谢谢,redbullsoundselect.com 做得怎么样?
-
我不认为幕后有什么特殊的逻辑。我猜他们的服务器知道所有路由,并返回具有相同路径的相同索引文件,但它唯一做的是将状态代码更改为 404。应用程序像往常一样运行到 404 状态(否则)。而且我敢肯定他们讨厌这种逻辑,因为它使他们在应用程序中添加/更改状态时随时更改 url,但是谷歌强迫你这样做,这样你就不会在谷歌结果中出现重定向到的垃圾 url 404
-
@Dvir,但是他们如何更改 SPA 上的状态代码
-
@Holy 他们是从服务器上做的。例如,如果您使用带有 angularjs SPA 的服务器,则必须将任何请求重定向到 index.html 文件,并保持查询字符串不变。服务器获取带有 url 的请求,他知道该 url 不存在,所以他将响应状态代码更改为 404 并使用查询字符串重定向到 index.html(原始请求:domain/some-invalid-page) .然后 angular 自己玩,他找不到状态,所以它会重定向到 404 状态。这里唯一改变的是状态码。