การเปลี่ยนเส้นทาง HTTP: 301 (ถาวร) กับ 302 (ชั่วคราว)


381

ลูกค้าควรประพฤติตนแตกต่างกันหรือไม่? อย่างไร?


RFC 2616 - รหัสสถานะ HTTPที่ฉันสามารถทำซ้ำทุกอย่างอยู่ในนั้น แต่ก็ระบุว่ามันค่อนข้างชัดเจน;)
Tiemen

2
เป็นที่น่าสังเกตว่า spec นั้นยังมีรหัสสถานะ 303 และ 307 สำหรับการเปลี่ยนเส้นทางชั่วคราวที่เหมาะสมยิ่งขึ้น
Patrick McElhaney

303 และ 307 ไม่ต้องการอีกต่อไปจริงๆ 303 ควรระบุว่า URL ใหม่นั้นเกี่ยวข้อง แต่ไม่เท่ากันและควรโหลดด้วย GET แม้ว่าคำขอปัจจุบันคือ POST แต่เบราว์เซอร์ก็ทำเช่นนี้กับ 302 อยู่ดี 307 ควรระบุอย่างชัดเจนว่าการเปลี่ยนเส้นทางนั้นชั่วคราวเมื่อเทียบกับ 302 ซึ่งไม่ได้ระบุว่าเป็นการชั่วคราวหรือไม่ แต่เบราว์เซอร์และซอฟต์แวร์รวบรวมข้อมูลถือว่า 302 เป็นการชั่วคราว
thomasrutter

คำตอบ:


569

สถานะ 301 หมายความว่าทรัพยากร (หน้า) ถูกย้ายอย่างถาวรไปยังตำแหน่งใหม่ ลูกค้า / เบราว์เซอร์ไม่ควรพยายามขอตำแหน่งเดิม แต่ใช้ตำแหน่งใหม่นับจากนี้เป็นต้นไป

สถานะ 302 หมายความว่าทรัพยากรอยู่ที่อื่นชั่วคราวและไคลเอนต์ / เบราว์เซอร์ควรร้องขอ URL เดิมต่อไป


12
ขอบคุณ. นี่หมายความว่าถ้าฉันใช้การเปลี่ยนเส้นทาง 301 (ถาวร) ลูกค้าสามารถตัดสินใจที่จะไม่เรียกคืนตำแหน่งเดิมอีกครั้งและใช้ URL ใหม่โดยตรงแทนเสมอ
flybywire

18
แน่นอน! ในความเป็นจริงตามข้อกำหนดลูกค้าควรไปที่ตำแหน่งใหม่เสมอ
Philippe Leybaert

7
แต่ในเบราว์เซอร์สิ่งนี้มีผลกระทบอย่างไร ยกตัวอย่างเช่นการเขียนประวัติลงในปุ่มย้อนกลับเพื่อหลีกเลี่ยงการกลับไปสู่ความผิดใน 301? แก้ไขบุ๊กมาร์กที่เงียบ ๆ ใน 301 หากคุณคลิกที่บุ๊กเก่า?
Xavi Montero

9
@XaviMontero เบราว์เซอร์ที่ทันสมัยที่สุดแคช 301s และจะไม่รบกวนการร้องขอแหล่งต้นฉบับเลยนานถึง 6 เดือน
Jon

34
เคล็ดลับที่จะจำรหัสสถานะ HTTP 301-> ระดับการใช้งานและ 302-> การเปลี่ยนเส้นทางชั่วคราวสองเริ่มต้นด้วย T เช่นเดียวกับการเริ่มต้นชั่วคราวกับ T
ScottCate

108

เมื่อสไปเดอร์ของเครื่องมือค้นหาค้นหารหัสสถานะ 301 ในส่วนหัวการตอบสนองของหน้าเว็บมันเข้าใจว่าหน้าเว็บนี้ไม่มีอยู่อีกต่อไปค้นหาส่วนหัวของตำแหน่งในการตอบสนองเลือก URL ใหม่และแทนที่ URL ที่จัดทำดัชนีด้วยอันใหม่ .

ดังนั้นเครื่องมือค้นหาจะรีเฟรช URL ที่จัดทำดัชนีทั้งหมดซึ่งไม่มีอยู่แล้ว (พบ 301 รายการ) ด้วย URL ใหม่สิ่งนี้จะรักษาปริมาณการเข้าชมหน้าเว็บเก่าของคุณและจะเปลี่ยนเป็นหน้าใหม่ (คุณจะไม่สูญเสียการเข้าชมหน้าเว็บเก่า)

เบราว์เซอร์: หากเบราว์เซอร์พบรหัสสถานะ 301 จากนั้นแคชจะทำการแมป URL เก่ากับ URL ใหม่ไคลเอ็นต์ / เบราว์เซอร์จะไม่พยายามขอตำแหน่งเดิม แต่ใช้ตำแหน่งใหม่นับจากนี้ไปเว้นแต่จะล้างแคช

ป้อนคำอธิบายรูปภาพที่นี่

เมื่อเดอร์เครื่องมือค้นหาพบ 302 สถานะสำหรับเว็บเพจมันจะเปลี่ยนเส้นทางไปยังตำแหน่งใหม่ชั่วคราวและรวบรวมข้อมูลทั้งสองหน้า URL หน้าเว็บเก่ายังคงมีอยู่ในฐานข้อมูลของเครื่องมือค้นหาและจะพยายามขอตำแหน่งเดิมและรวบรวมข้อมูล ลูกค้า / เบราว์เซอร์จะยังคงพยายามขอตำแหน่งเดิม

ป้อนคำอธิบายรูปภาพที่นี่

อ่านเพิ่มเติมเกี่ยวกับวิธีใช้งานใน asp.net c # และผลกระทบต่อเครื่องมือค้นหาคืออะไร - http://www.dotnetbull.com/2013/08/301-permanent-vs-302-temporary-status-code-aspnet -csharp-Implementation.html


35

301 และ 302 ส่วนใหญ่มีความสำคัญต่อการจัดทำดัชนีในเครื่องมือค้นหาเนื่องจากโปรแกรมรวบรวมข้อมูลใช้ข้อมูลนี้และโอน PageRank เมื่อใช้ 301

ดูคำตอบของ Peter Leeสำหรับรายละเอียดเพิ่มเติม


20

301 คือทรัพยากรที่ร้องขอได้รับการกำหนด URI ถาวรใหม่และการอ้างอิงใด ๆ ในอนาคตไปยังทรัพยากรนี้ควรทำโดยใช้หนึ่งใน URI ที่ส่งคืน

302 คือทรัพยากรที่ร้องขอนั้นอยู่ภายใต้ URI อื่นชั่วคราว

เนื่องจากการเปลี่ยนเส้นทางอาจมีการเปลี่ยนแปลงในบางโอกาสลูกค้าควรใช้ Request-URI ต่อไปสำหรับคำขอในอนาคต

การตอบสนองนี้จะสามารถเข้าถึงได้หากระบุโดยเขตข้อมูลส่วนหัวควบคุมแคชหรือหมดอายุ


1
ดังนั้น 301 ทำให้รู้สึก แต่ฉันมีช่วงเวลาที่ยากขึ้นมาพร้อมกับการใช้งานตัวอย่างที่ดีสำหรับ302
Bob Stein

4
@ BobStein-VisiBone สำหรับตัวอย่างของการเปลี่ยนเส้นทาง 302: สร้างไฟล์ old.php มีรหัส<?php header("location: http://example.com/new.php"); ?>และไฟล์ new.php - <?php echo 'I am new'; ?>และไปที่การเชื่อมโยง จะมีการเปลี่ยนเส้นทางและแสดงข้อความ "ฉันใหม่" จากนั้นให้เปลี่ยนรหัสใน old.php ไป<?php echo 'I am old'; ?>และไปที่การเชื่อมโยง คุณจะเห็นข้อความ "ฉันแก่แล้ว" หากคุณทำการเปลี่ยนเส้นทาง 301 ใน old.php คุณจะเห็นข้อความ "ฉันใหม่" แม้หลังจากการเปลี่ยนแปลงในรหัสของ old.php
อัครสาวก

2
@ BobStein-VisiBone ฉันมีหน้าเว็บที่เลิกใช้แล้วและไม่สามารถแสดงได้ เราจำเป็นต้องสร้างหน้าใหม่ แต่จะไม่พร้อมสักครู่ เราใช้การนำทางชั่วคราวไปยังหน้าที่มีอยู่ซึ่งเป็นประโยชน์ต่อผู้เข้าชม เมื่อสร้างหน้าใหม่แล้วเราจะใช้การเปลี่ยนเส้นทางแบบถาวรไปยังหน้านั้น
EddieC

4
302 มีประโยชน์หาก URL ปลายทางของคุณขึ้นอยู่กับสถานะ
Brian

7
ตอนนี้ฉันผ่านไปซักพักแล้ว แต่นี่เป็นตัวอย่างที่ดี คอมมิคส์มักจะมี URL ที่นำไปสู่การ์ตูนล่าสุด หากเป็นwebcomic.com/latestและเปลี่ยนเส้นทางไปwebcomic.com/some-comic-titleที่ 301 ด้วยเบราว์เซอร์จะเปลี่ยนเส้นทางไปยัง "some-comic-title" แม้ว่าจะมีการตีพิมพ์การ์ตูนเรื่องต่อไปและตอนนี้ "ล่าสุด" ก็เปลี่ยนเส้นทางไปยัง "อีกชื่อการ์ตูน" ... นี่คือสิ่งที่ 302 จะดีกว่า
hsan

17

การเปลี่ยนเส้นทาง 301 ถูกแคชอย่างไม่มีกำหนด (อย่างน้อยในบางเบราว์เซอร์)

ซึ่งหมายความว่าหากคุณตั้งค่า 301 ให้ไปที่หน้านั้นคุณไม่เพียง แต่ได้รับการเปลี่ยนเส้นทาง แต่การเปลี่ยนเส้นทางนั้นจะถูกแคช

เมื่อคุณเยี่ยมชมหน้านั้นอีกครั้งเบราว์เซอร์ * ของคุณไม่สนใจที่จะขอ URL นั้น แต่เพียงไปที่เป้าหมายการเปลี่ยนเส้นทางที่แคชไว้

วิธีเดียวที่จะยกเลิก 301 สำหรับผู้เข้าชมที่เปลี่ยนเส้นทางใน Cache นั้นคือการเปลี่ยนเส้นทางกลับไปที่ URL เดิม ** ในกรณีนี้เบราว์เซอร์จะสังเกตเห็นลูปและสุดท้ายก็ขอ URL ที่ป้อนจริงๆ

เห็นได้ชัดว่านั่นไม่ใช่ตัวเลือกถ้าคุณตัดสินใจที่จะ 301 บน Facebook หรือทรัพยากรอื่น ๆ ที่คุณไม่สามารถควบคุมได้อย่างเต็มที่

น่าเสียดายที่ผู้ให้บริการโฮสติ้งหลายแห่งมีคุณสมบัติในส่วนต่อประสานผู้ดูแลระบบของพวกเขาที่เรียกว่า "การเปลี่ยนเส้นทาง" ซึ่งจะเปลี่ยนเส้นทาง 301 หากคุณกำลังใช้สิ่งนี้เพื่อเปลี่ยนเส้นทางโดเมนของคุณไปที่ Facebook เป็นการชั่วคราวในเร็ว ๆ นี้คุณจะถูกทำให้ตกใจโดยทั่วไป

* อย่างน้อย Chrome และ Firefox ตามที่เบราว์เซอร์ทำแคช HTTP 301s นานเท่าใด . เพิ่งลองกับ Chrome 45 แก้ไข: Safari 7.0.6 บน Mac ยังแคชอยู่การรีสตาร์ทเบราว์เซอร์ก็ไม่ได้ช่วย (ลิงก์บอกว่าบน Safari 5 บน Windows จะช่วยได้)

** ฉันลอง javascript window.location = ''เพราะมันจะเป็นวิธีแก้ปัญหาที่สามารถนำไปใช้ในกรณีส่วนใหญ่ - มันไม่ทำงาน มันส่งผลให้เกิดการวนซ้ำไม่สิ้นสุด อย่างไรก็ตาม PHP header('Location: new.url')จะทำลายลูป

Bottom Line: ใช้ 301s เท่านั้นหากคุณมั่นใจอย่างแน่นอนว่าคุณจะไม่ใช้ URL นั้นอีก มักจะไม่เคยอยู่บน root dir (example.com/)


7

ปัญหาหลักของ 301 คือเบราว์เซอร์จะแคชการเปลี่ยนเส้นทางแม้ว่าคุณจะปิดการใช้งานการเปลี่ยนเส้นทางจากระดับเซิร์ฟเวอร์

จะดีกว่าเสมอที่จะใช้ 302 หากคุณเปิดใช้งานการเปลี่ยนเส้นทางสำหรับช่วงเวลาการบำรุงรักษาสั้น ๆ


ไม่ใช่ปัญหา "แน่นอน"; มันเป็นเพียงวิธีการทำงานของมัน การเปลี่ยนเส้นทาง HTTP ไปยัง HTTPS การเปลี่ยนเส้นทางเว็บไซต์ที่ถูกทอดทิ้งไปยังใหม่ ฯลฯ เป็นวิธีการใช้งานปกติ 301 รายการ
HosseyNJF
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.