301重定向到404页面或将状态代码设置为404并停留在页面上?


9

我的网站上有很多页面,只有管理员可以访问,并且如果找到并正确设置了querystring值,则会给出这些页面。例如:

http://www.mydomain.com/show-daily-statistics?key=abc


上面的链接将显示页面的内容,但是诸如以下的其他任何内容都不会:

http://www.mydomain.com/show-daily-statistics


现在,我正在考虑如果搜索引擎和/或非管理员用户以某种方式落在这些隐藏页面上该怎么办。

我当然可以将页面的状态码更改为404或301重定向到:

http://www.mydomain.com/404-error


关于Google和SEO的最佳解决方案是什么?


6
如果您要隐藏的信息根本不重要,我会考虑实施实际的身份验证。除此之外,301重定向在语义上指示内容已移动,此处不是这种情况,因此是不适当的响应。

Answers:


11

正确的代码将是401未经授权

按照HTTP规范

10.4.2 401未经授权

该请求需要用户认证。响应必须包括一个WWW-Authenticate头域(第14.47节),其中包含适用于所请求资源的质询。客户可以用合适的授权头域(第14.8节)重复请求。如果请求已包含授权凭证,则401响应指示已拒绝这些凭证的授权。如果401响应包含与先前响应相同的质询,并且用户代理已经尝试了至少一次身份验证,则应向用户提供响应中给定的实体,因为该实体可能包括相关的诊断信息。HTTP访问身份验证在“ HTTP身份验证:基本和摘要访问身份验证” [43]中进行了说明。

或者

10.4.4 403禁止

服务器理解了该请求,但拒绝执行该请求。授权将无济于事,并且不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开为什么未满足请求,则应在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以改用状态代码404(未找到)。

从语义上讲,这两者都比404。资源存在,所以不404正确。401应该是正确的,但是您不需要身份验证。默默无闻的安全不是安全。403当请求被理解时也是正确的,资源存在就是拒绝服务请求。404如果您不想透露403发生的原因,则比较合适。

在任何情况下,301重定向是不是合适,资源没有移动。


2
Google不会索引并删除返回401/403状态消息的页面,有段时间有人问类似的问题,或者您可以始终使用简单的noindex使用robots.txt进行阻止
Simon Hayter

1
@ WPRookie82关于通过保密来保护页面-您做错了。
Cthulhu 2014年

4
默默无闻的安全性根本不是安全性

1
之前已经讨论了将401用于HTTP基本或摘要身份验证(或其他RFC2617兼容的身份验证方案)以外的身份验证方法;我当时仍然坚持的观点是,它可能在实践中可行,但是根据HTTP规范,它并不是真正有效的,无论如何,最好是403甚至404。
Ilmari Karonen 2014年

1
我同意其他评论,根据HTTP规范,“ 401未经授权”是不合适的。
斯蒂芬·奥斯特米勒

1

由于这是一个供管理员使用的页面,因此无论是否带有“ key”参数,这些页面都不能也不应该建立索引。因此,非管理员网页可以发送404状态代码,并且您可以保留相同的URL。不要重定向,因为您告诉Google页面已移动,但是随后又转到了不存在的页面。

Google也是如此。查看转到虚拟页面时发生的情况:http : //www.google.com/analytics/asdsas


我上面的帖子有一个小的更正http://www.example.com/404-error,它是整个网站的一种全局404页面,所以我不会被重定向到一个不存在的页面。
WPRookie82 2014年

@ WPRookie82:就您和您的Web服务器以外的任何其他人而言,不存在的页面和返回404响应的现有页面之间没有区别。
Ilmari Karonen 2014年

1

在这种情况下,语义正确的HTTP响应代码为403 Forbidden

服务器理解了该请求,但拒绝执行该请求。授权将无济于事,并且不应重复该请求。如果请求方法不是HEAD,并且服务器希望公开为什么未满足请求,则应在实体中描述拒绝的原因。如果服务器不希望将此信息提供给客户端,则可以使用状态代码404(未找到)来代替。

(尽管403响应的定义说“授权无济于事”,但IMO应该理解为专门指HTTP Basic / Digest身份验证,应改为使用状态代码“ 401未经授权”。因为您没有使用这些验证方法中的任一种,您的情况下403都是适当的状态代码。)


但是,使用403个状态码显示(或至少强烈暗示)的事实,有与该URL的网页,即使服务器拒绝提供它。由于您可能希望对潜在的入侵者隐瞒这件事,因此HTTP / 1.1标准明确允许返回404 Not Found状态代码(重点是我):

服务器未找到与请求URI匹配的任何内容。没有迹象表明这种情况是暂时的还是永久的。如果服务器通过某种内部可配置的机制得知旧资源永久不可用并且没有转发地址,则应使用410(已消失)状态代码。 当服务器不希望确切显示请求被拒绝的原因或没有其他响应可用时,通常使用此状态代码。

当然,要使这种隐藏完全有效,您返回的404错误页面必须与您为实际不存在的页面返回的内容相同。否则,它只会愚弄最愚蠢和最随意的攻击者。(如果您的目标只是使页面不在Google的索引之内,则403响应也将这样做。)


您的问题和其他答案中建议的其他可能回答是什么?

如前所述,我认为此处不适合使用401响应。可以在实际工作中,只要大多数浏览器和搜索引擎将处理任何格式不正确或无法识别的4 XX系列响应代码,就好像它是一个404,但根据仍然不是有效的HTTP规范,而且也没有实际的理由,更喜欢它超过403或404。

至于使用301(或302)重定向到单独的“ 404错误”页面,这是草率的mod_rewrite教程所传播的一种糟糕的做法,与直接返回404响应相比,它绝对没有兑换功能:

  • 访问者感到困惑,因为他们尝试访问的URL被错误页面的URL取代。因此,他们看到一则消息说,他们已经到了一个不存在的页面,但不容易看到的迹象是什么他们试图访问的页面,所以不能轻易尝试像URL固定任何明显的错别字任何恢复策略,或将其复制并粘贴到Google或Wayback Machine中。

  • 它可能会使搜索引擎感到困惑,特别是如果robots.txt中不允许您的404页面,或者如果它错误地返回200 OK响应而不是真实的404状态代码(“软404”),则可能导致您的404页面出现在搜索中随机搜索词的搜索结果。

  • 这会导致您服务器上的负载量很少,增加对访问者的响应时间,并有可能减慢搜索引擎抓取您的网站的速度,因为对不存在(或隐藏)页面的每个请求现在都需要进行额外的HTTP回合,旅行。

  • 它没有SEO的好处,因为从页面重定向到404页面的任何“链接汁”都会丢失。

(当然,在一个情况下,你要使用301重定向,而不是404响应的是在实际的页面已经感动了,你可以重定向访问者到其正确位置。但是,这不是这里的情况进行讨论。)


最后,我想表达一种观点,在这里的许多评论中都表明,仅仅像这样“隐藏”您的管理页面并不能完全替代基于密码的身份验证。就是说,如果您已经建立了安全的身份验证系统,则在纵深防御方法中,隐藏页面可能会作为额外的一层(尽管相当薄弱)很有用。


我最终决定选择您在第二部分中提出的建议。谁在没有有效密钥的情况下登陆页面,谁都会看到我的常规404页面,我当然会在此过程中返回状态代码404。
WPRookie82 2014年

1

我会noindex,nofollow,noarchive在您想摆脱搜索的页面顶部使用标签。

我发现该noarchive标签往往会使事情很快从搜索中删除,而这noindex可能会阻止它进入搜索,但是如果它已经在那里,则需要将其从搜索结果中清除。

至于管理员访问权限问题,这里的其他人已经给出了一些有关安全性的建议,我建议您检查一下。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.