Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要使用http重定向代码302还是307?_Http_Search_Redirect_Seo_Search Engine - Fatal编程技术网

我需要使用http重定向代码302还是307?

我需要使用http重定向代码302还是307?,http,search,redirect,seo,search-engine,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.

假设我的网站上有一个页面显示当月的媒体发布
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

我的问题是,如果我想让google在没有查询参数的情况下索引页面,我应该使用状态代码302还是307来执行重定向

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


[*]我正在使用一个封闭源代码的.NET CMS功能,所以我的手很累。

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

另一种可以考虑进行的方式是用JavaScript重定向和<代码> <代码>标签来解释正在发生的事情。这也会弄糟非javascript浏览器,您必须小心避免,但我怀疑只要您的noscript包含与新URL匹配的超链接,您就可以了

无论哪种方式,如果可能的话,我仍然会继续执行纯服务器端请求。见鬼,如果你的预期流量很小,你可以在没有查询字符串的情况下将你的主页作为代理。让它使用一个后台线程请求查询字符串并输出结果。:-)

编辑刚刚看到您正在使用.NET。也许从SO中考虑这个答案:

< P>似乎表明302和307都等价地被处理,并且“Google将继续爬行并索引原始位置。” 但是面对模棱两可的局面,你不妨深入研究RFC,尝试做正确的事情,天真地希望爬虫也会这样做。在本例中,包含每个响应代码几乎相同的定义,但有一个例外:

302:由于重定向有时可能会被更改,因此客户端应继续在将来的请求中使用请求URI

307:由于重定向有时可能会被更改,因此客户端应继续为将来的请求使用请求URI

我觉得这并不是一个显著的区别。我的理解是302告诉客户站长不可信,307明确告诉站长客户不会信任他们,所以他们可以自由改变重定向

我认为更能说明问题的是302定义中的注释:

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


对我来说,这表明302和307在很大程度上是等效的,但HTTP/1.0客户端在第一次时未能正确实现302。

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

要得到一个很长的答案,首先我们需要一些背景知识

当获取重定向代码时,客户端可以(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。所以HTTP1.1添加了303(急需),但也决定添加307,这在技术上与302相同,但是一种“显式302”;它说“是的,我知道302的问题,我知道我在做什么,给我行为(A)”

现在,回到我们的问题上来。现在您知道为什么在大多数情况下需要303


想要保留请求类型的情况非常罕见。如果你真的发现自己有这样的情况,答案很简单:使用302。要么客户端讲HTTP 1.0,在这种情况下,它无法理解307;或者它说的是HTTP 1.1,这意味着它没有理由保留旧客户端的叛逆行为,也就是说,它正确地实现了302,所以使用它吧

5年过去了。。。请注意,307的行为已于2014年6月更新,