我需要使用http重定向代码302或307吗?

时间:2010-03-18 05:12:14

标签: http search redirect seo search-engine

假设我的网站上有一个页面,用于显示当月的媒体发布
http://www.mysite.com/mediareleases.aspx

由于进入*的原因很简单,为了生成这个列表,必须给这个页面提供一个当月查询字符串:
http://www.mysite.com/mediareleases.aspx?prevDays=18

因此,我需要将请求http://www.mysite.com/mediareleases.aspx的客户重定向到http://www.mysite.com/mediareleases.aspx?prevDays=whateverDayOfTheMonthItIs

我的问题是,如果我想谷歌索引没有查询参数的页面,我应该使用状态代码302或307来执行重定向吗?

两者都表明页面已经“暂时”移动 - 这就是我想要的,因为如果你理解了我的意思,页面每天都会“移动”。

[*]我正在使用闭源.NET CMS的一个功能,所以我的双手并列。

4 个答案:

答案 0 :(得分:18)

Google's documentation似乎表明302和307都得到了相同的处理,并且“Googlebot将继续抓取并索引原始位置。”

但是面对模棱两可的情况,你不妨深入研究RFC并尝试做正确的事情,天真的希望爬行者会这样做。在这种情况下,RFC 2616 § 10.3包含每个响应代码几乎相同的定义,但有一个例外:

  

302:由于重定向可能有时会被更改,客户端应该继续使用Request-URI进行将来的请求。

     

307:由于有时会改变重定向 MAY ,客户端应该继续使用Request-URI来处理将来的请求。

这并没有让我感到特别重要。我的阅读是302指示客户网站管理员不值得信任,307明确告诉网站管理员客户不会信任他们,所以他们可以自由地改变重定向。

我认为更有说服力的一点是302定义中的注释:

  

注意:RFC 1945和RFC 2068指定不允许客户端更改重定向请求上的方法。但是,大多数现有的用户代理实现将302视为303响应,对Location字段值执行GET,而不管原始请求方法如何。已经为希望明确说明客户期望哪种反应的服务器添加了状态代码303和307.

对我来说,表示302和307大致相同,但HTTP / 1.0客户端第一次无法正确实现302。

答案 1 :(得分:12)

简短回答:两者都没有。 在大多数情况下,您真正​​想要使用的代码是

对于长篇答案,首先我们需要一些背景知识。

获取重定向代码时,客户端可以(A)使用相同的请求类型加载新位置,或者(B)它可以覆盖它并使用GET。

HTTP 1.0规范没有303和307,它只有302,它强制执行(A)行为。但在实践中发现(A)导致提交表格的问题。

假设你有一个联系表格,访问者填写并提交,客户得到302页面说“谢谢,我们会回复你”。表单是使用POST发送的,因此感谢页面也使用POST加载。现在假设访问者重新加载;请求的重新发送方式与第一次获取的方式相同,即使用POST(以及正文中的相同负载)。最终结果:表单提交两次(每次重新加载一次)。即使客户在执行此操作之前要求用户进行确认,但在大多数情况下仍然很烦人。

此问题变得非常普遍,客户端生产商决定覆盖规范并发出重定向位置的GET请求。基本上,它是HTTP 1.0规范中的疏忽。客户最需要的是303(和上面的行为(B)),但他们只得到302(和(A))。

如果HTTP 1.0同时提供302和303,则没有问题。但它没有,所以它导致了302没人正确使用。所以HTTP 1.1增加了303(非常需要),但也决定添加307,这在技术上与302相同,但是是一种“显式302”;它说“是的,我知道302周围的问题,我知道我在做什么,给我行为(A)”。

现在,回到我们的问题。你现在看到为什么在大多数情况下你会想要303

您希望保留请求类型的情况非常罕见。如果你确实发现了这种情况,答案很简单:使用302.客户端说HTTP 1.0,在这种情况下它无法理解307;或者它说HTTP 1.1,这意味着它没有理由保留旧客户的叛逆行为,即。它正确实现302,所以使用它!

答案 2 :(得分:4)

5年......注意307的行为已于2014年6月由RFC-7231#6.4.7更新,现在与302的行为明显不同,因为该方法可能不会改变:

  

307(临时重定向)状态代码表示目标   资源临时驻留在不同的URI和用户代理之下   如果它执行自动,则不得更改请求方法   重定向到该URI。

原始问题可能不是问题,但可能与其他遇到这个问题的人有关。

答案 3 :(得分:0)

我感觉到你的痛苦。至于解决方案,很难说搜索引擎会做什么。似乎每个人都有自己的处理重定向的方式。 This link建议302将索引重定向页面的内容,但仍然使用主页面链接,但不清楚307将做什么。

您可以考虑继续进行的另一种方法是使用javascript重定向和<noscript>标记来解释正在发生的事情。这也会导致非JavaScript浏览器崩溃,你必须小心谨慎以避免Google's sneaky-site detection routine,但我怀疑只要你的noscript包含一个与新URL匹配的超链接就可以了。

无论哪种方式,我仍然会尽可能地追求纯粹的服务器端请求。哎呀,如果您的预期流量很小,那么在没有查询字符串的情况下,您可以将主页视为代理。让它使用后台线程来使用查询字符串请求自己并输出结果。 : - )

编辑刚看到你正在使用.NET。也许从SO C# Can i modify Request.Form's variables?来考虑这个答案。