本文要点
先看第一问:这次移动是永久的,还是暂时的
第二问是请求方法会不会被改变
303 See Other不能简单塞进“保留方法”或“改变方法”这两栏,因为MDN对它的说明写的是另一件事

本文目录
先按两个问题给五个状态码分组
如果你在响应里看到301、302、303、307或308,想弄清它们差在哪,可以先问两个问题:这次移动是永久的还是暂时的?原来的请求方法会不会被改变?
按MDN对HTTP响应状态码的说明,这五个码都属于300–399这一档的“重定向消息”。它们各自回答的问题不同:
- 301 Moved Permanently:请求资源的URL已永久更改,响应里给出新的URL。
- 302 Found:所请求资源的URI已暂时更改,未来可能进一步改变,客户机应在将来的请求中继续使用这个相同的URI。
- 303 See Other:服务器发送此响应,指示客户端通过一个GET请求在另一个URI中获取所请求的资源。
- 307 Temporary Redirect:指示客户端使用在前一个请求中使用的相同方法,在另一个URI上获取资源。
- 308 Permanent Redirect:资源现在永久位于Location标头指定的另一个URI。
把两个问题叠在一起看,就能得到本文要讲的全部差别。下面各节分别展开,不重复同一组事实。
永久还是暂时:301和308是永久,302、303、307是暂时
先看第一问:这次移动是永久的,还是暂时的。
按MDN的表述,明确写成“永久”的有两个:
- 301 Moved Permanently:请求资源的URL已永久更改。
- 308 Permanent Redirect:资源现在永久位于Location标头指定的另一个URI。
明确写成“暂时”的有三个:
- 302 Found:所请求资源的URI已暂时更改,未来可能会对URI进行进一步的改变。
- 307 Temporary Redirect:从名称和说明看,它对应的是临时重定向。
- 303 See Other:MDN的说明没有使用“永久”或“暂时”这两个词,它讲的是“通过一个GET请求在另一个URI中获取所请求的资源”。所以303在永久或暂时这一点上,资料没有给出与301、302并列的表述,本文不替它补一个。
这样分组的意义在于:永久和暂时回答的是“以后还要不要用原来的地址”。301和308说的是原地址已经不再对应这个资源;302和307说的是这次先换到别处,将来可能还会变。
方法是否保留:307和308明确写了不能改,301和302没有这句
第二问是请求方法会不会被改变。这一问上,MDN对307和308写得最直接。
307 Temporary Redirect的说明是:指示客户端使用在前一个请求中使用的相同方法,在另一个URI上获取所请求的资源。MDN还补了一句:这与302 Found具有相同的语义,但用户代理不能更改所使用的HTTP方法——如果在第一个请求中使用了POST,则在第二个请求中必须使用POST。
308 Permanent Redirect的说明是:这与301 Moved Permanently具有相同的语义,但用户代理不能更改所使用的HTTP方法——如果在第一个请求中使用POST,则必须在第二个请求中使用POST。
把这两句和301、302对照,差别就出来了:
- 307和308:资料明确写了“不能更改所使用的HTTP方法”,并给了POST的例子。
- 301和302:MDN对这两个码的说明里,没有出现“不能更改方法”这句话。资料只写了URL永久更改或URI暂时更改,没有对方法作同样的限定。
所以“方法是否保留”这一问,能按资料直接回答的是307和308:保留。301和302在这一问上,资料没有给出与307、308相同的明确表述,本文不把“301和302一定改方法”或“301和302一定不改方法”写成结论。
303是另一种情况:它指向的是用GET去取
303 See Other不能简单塞进“保留方法”或“改变方法”这两栏,因为MDN对它的说明写的是另一件事。
原文是:服务器发送此响应,以指示客户端通过一个GET请求在另一个URI中获取所请求的资源。
这句话的关键词是GET。它说的不是“沿用原来的方法”,也不是“用户代理可以自行决定改不改”,而是明确指向用GET这个请求去另一个URI取资源。
所以把五个码放在一起看,方法这一栏可以分成三种写法:
1. 明确写“不能更改方法”:307、308。
2. 明确写“通过GET请求获取”:303。
3. 没有写方法相关限定:301、302。
这三栏是资料本身写法的差别,不是对某个具体服务器行为的推断。
把两个问题合成一张对照表
下面这张表是把前面两节的资料表述并排放在一起,方便你按两个问题快速定位。表中内容全部来自MDN对这几个状态码的说明,没有补充资料之外的结论。
| 状态码 | 永久还是暂时 | 方法相关表述 |
| --- | --- | --- |
| 301 | 永久更改 | 资料未写方法限定 |
| 302 | 暂时更改 | 资料未写方法限定 |
| 303 | 资料未用永久/暂时表述 | 指示通过GET请求在另一个URI获取 |
| 307 | 临时重定向 | 不能更改方法,POST仍用POST |
| 308 | 永久位于另一个URI | 不能更改方法,POST仍用POST |
读这张表时注意两处空白。第一处是303的“永久还是暂时”这一格,资料没有给出对应表述,所以留空,不填“暂时”。第二处是301和302的“方法相关表述”这一格,资料没有写方法限定,所以写“未写”,不填“会改”或“不会改”。
这两处空白不是遗漏,而是资料边界。把它们标出来,比硬填一个看起来整齐的答案更可靠。
自建练习:用一份对照记录表逐项核对
下面是一个编辑设计的练习方法,用来把上面五个码的差别记成自己的笔记,不是对某个真实网站的测试记录。
在练习目录里新建一个纯文本文件,例如 exercise/redirect_notes.txt,按下面四列写表头:
状态码 | 永久还是暂时 | 方法是否保留 | 资料原文关键词然后逐行填写。填写时只允许两种来源:一是MDN说明里的原词,二是“资料未写”。例如:
301 | 永久 | 资料未写 | URL已永久更改
302 | 暂时 | 资料未写 | URI已暂时更改
303 | 资料未写 | 通过GET请求 | See Other
307 | 临时 | 不能更改 | 相同方法
308 | 永久 | 不能更改 | 不能更改所使用的HTTP方法这份记录的作用是让你在遇到某个状态码时,先回到“永久还是暂时”“方法是否保留”这两栏,而不是凭印象把301和302当成同一件事。填写前建议先复制一份练习目录,不要拿正在用的资料直接改。
需要说明的是,这张表只整理状态码本身的语义差别,不涉及缓存策略怎么配置,也不涉及具体站点跳转的排查。
容易混的两组:301与308、302与307
最后把最容易混的两组单独说清,因为它们的差别正好落在本文的两个问题上。
第一组是301和308。按MDN的说明,308“与301 Moved Permanently具有相同的语义”,差别在于308多了一句“用户代理不能更改所使用的HTTP方法”。也就是说,在“永久还是暂时”这一栏,两者一致;在“方法是否保留”这一栏,308有明确表述,301没有。
第二组是302和307。按MDN的说明,307“与302 Found具有相同的语义”,差别同样在于307多了一句“用户代理不能更改所使用的HTTP方法”。所以在“暂时”这一栏,两者一致;在方法这一栏,307有明确表述,302没有。
这两组对照说明一件事:只看“永久还是暂时”,会把301和308、302和307看成同一类;只有把方法这一问也加上,才能把它们分开。
本文只讲这五个状态码在永久或暂时、方法是否可能被改变上的差别。不涉及缓存策略配置,也不涉及具体站点跳转的排查。
观看知识要点视频 18 秒
18秒无旁白要点导览,文字来自已审核正文;完整步骤、条件及参考资料见下方。
参考资料
以下原始资料提供本文依据;请结合日期、适用条件和产品说明查阅。
请结合原始资料的适用条件阅读。
返回浏览器工具 →