รหัสสถานะ HTTP 301 และ 308 แตกต่างกันอย่างไร


138

HTTP 301และ308รหัสสถานะต่างกันอย่างไร

  • 301 (ย้ายถาวร): คำขอนี้และในอนาคตทั้งหมดควรถูกส่งไปยัง URI ที่กำหนด

  • 308 (การเปลี่ยนเส้นทางถาวร): คำขอและคำขอในอนาคตทั้งหมดควรทำซ้ำโดยใช้ URI อื่น

พวกเขาดูเหมือนจะคล้ายกัน


ไม่มีรหัส 308 ในtools.ietf.org/html/rfc2616และtools.ietf.org/html/rfc6585ดังนั้นคำถามจะต้องถูกส่งไปยังผู้คิดค้นโค้ดที่ไม่ได้มาตรฐานนี้
KonstantinL

4
มีข้อกำหนด RFC 7538 ดังนั้นจึงเป็นรหัส HTTP จริง
Alexander Drobyshevsky

2
ดีtools.ietf.org/html/rfc7538 : หมายเหตุ: รหัสสถานะนี้จะคล้ายกับ 301 ยกเว้นว่าจะไม่อนุญาตให้มีการเปลี่ยนแปลงวิธีการร้องขอจากโพสต์ที่จะได้รับ
KonstantinL

4
อย่าใช้ RFC 2616 เป็นข้อมูลอ้างอิง มันล้าสมัยโดย RFCs 7230-35
Cassiomolin

คำตอบ:


258

ภาพรวมของ301, 302และ307

RFC 7231อ้างอิงปัจจุบันความหมายและเนื้อหาของ HTTP / 1.1 โปรโตคอลกำหนด301(ย้ายถาวร) และ302รหัสสถานะ (พบ) ที่ช่วยให้วิธีการขอให้มีการเปลี่ยนแปลงไปPOST GETข้อกำหนดนี้ยังกำหนด307(ชั่วคราวเปลี่ยนเส้นทาง) รหัสสถานะที่ไม่อนุญาตให้ใช้วิธีการขอให้มีการเปลี่ยนแปลงไปPOSTGET

ดูรายละเอียดเพิ่มเติมด้านล่าง:

6.4.2 301 ย้ายถาวร

301(ย้ายถาวร) รหัสสถานะบ่งชี้ว่าทรัพยากรเป้าหมายได้รับมอบหมายถาวร URI ใหม่และการอ้างอิงในอนาคตใด ๆ กับทรัพยากรนี้ควรจะใช้อย่างใดอย่างหนึ่งของยูริที่แนบมา [ ... ]

หมายเหตุ:ด้วยเหตุผลทางประวัติศาสตร์ตัวแทนผู้ใช้อาจเปลี่ยนวิธีการร้องขอจากPOSTเป็นGETสำหรับการร้องขอในภายหลัง หากพฤติกรรมนี้ไม่เป็นที่ต้องการ307สามารถใช้รหัสสถานะ (การเปลี่ยนเส้นทางชั่วคราว) แทนได้

6.4.3 พบ 302

302(พบ) รหัสสถานะบ่งชี้ว่าทรัพยากรเป้าหมายอาศัยอยู่ชั่วคราวภายใต้ URI ที่แตกต่างกัน เนื่องจากการเปลี่ยนเส้นทางอาจมีการเปลี่ยนแปลงในบางครั้งไคลเอนต์จึงควรใช้ URI คำขอที่มีประสิทธิภาพต่อไปสำหรับคำขอในอนาคต [ ... ]

หมายเหตุ:ด้วยเหตุผลทางประวัติศาสตร์ตัวแทนผู้ใช้อาจเปลี่ยนวิธีการร้องขอจากPOSTเป็นGETสำหรับการร้องขอในภายหลัง หากพฤติกรรมนี้ไม่เป็นที่ต้องการ307สามารถใช้รหัสสถานะ (การเปลี่ยนเส้นทางชั่วคราว) แทนได้

6.4.7 307 การเปลี่ยนเส้นทางชั่วคราว

307(ชั่วคราวเปลี่ยนเส้นทาง) รหัสสถานะบ่งชี้ว่าอยู่ทรัพยากรเป้าหมายชั่วคราวภายใต้แตกต่างกัน URI และตัวแทนของผู้ใช้จะต้องไม่เปลี่ยนวิธีการร้องขอถ้ามันดำเนินการเปลี่ยนเส้นทางโดยอัตโนมัติเพื่อ URI ที่ เนื่องจากการเปลี่ยนเส้นทางสามารถเปลี่ยนแปลงได้ตลอดเวลาไคลเอนต์จึงควรใช้ URI คำขอเดิมที่มีผลบังคับใช้ต่อไปสำหรับคำขอในอนาคต [ ... ]

หมายเหตุ:รหัสสถานะนี้จะคล้ายกับ302(พบ) ยกเว้นว่าจะไม่อนุญาตให้มีการเปลี่ยนแปลงวิธีการร้องขอจากไปPOST GETข้อกำหนดนี้ไม่ได้กำหนดคู่ที่เทียบเท่าสำหรับ301(ย้ายถาวร) ( RFC 7238อย่างไรก็ตามกำหนดรหัสสถานะ308 (การเปลี่ยนเส้นทางถาวร) สำหรับวัตถุประสงค์นี้)

ความจำเป็นในการ 308

RFC 7238ได้ถูกสร้างขึ้นเพื่อกำหนด308(ถาวรเปลี่ยนเส้นทาง) รหัสสถานะที่คล้ายกับ301(ย้ายถาวร) แต่ไม่ได้ช่วยให้วิธีการขอให้มีการเปลี่ยนแปลงไปPOSTGET

308รหัสสถานะที่ถูกกำหนดในขณะนี้โดยRFC 7538 (ที่จำหน่ายแล้วRFC 7238 )

3. 308 การเปลี่ยนเส้นทางถาวร

308(ถาวรเปลี่ยนเส้นทาง) รหัสสถานะบ่งชี้ว่าทรัพยากรเป้าหมายได้รับมอบหมายถาวร URI ใหม่และการอ้างอิงในอนาคตใด ๆ กับทรัพยากรนี้ควรจะใช้อย่างใดอย่างหนึ่งของยูริที่แนบมา ไคลเอนต์ที่มีความสามารถในการแก้ไขลิงก์ควรเชื่อมโยงการอ้างอิงไปยัง URI คำขอที่มีประสิทธิภาพอีกครั้งโดยอัตโนมัติกับการอ้างอิงใหม่ที่ส่งโดยเซิร์ฟเวอร์หากเป็นไปได้ [ ... ]

หมายเหตุ:รหัสสถานะนี้จะคล้ายกับ301(ย้ายถาวร) ยกเว้นว่ามันไม่ได้ช่วยให้การเปลี่ยนวิธีการร้องขอจาก ไปPOSTGET

เรามีสิ่งต่อไปนี้:

                                                             +-----------+-----------+
                                                             | Permanent | Temporary |
+------------------------------------------------------------+-----------+-----------+
| Allows changing the request method from POST to GET        | 301       | 302       |
+------------------------------------------------------------+-----------+-----------+
| Doesn't allow changing the request method from POST to GET | 308       | 307       |
+------------------------------------------------------------+-----------+-----------+

การเลือกรหัสสถานะที่เหมาะสมที่สุด

Michael Kropatรวบรวมชุดแผนภูมิการตัดสินใจที่ช่วยในการกำหนดรหัสสถานะที่ดีที่สุดสำหรับแต่ละสถานการณ์ ดูรหัสสถานะ2xxและ3xxรหัสต่อไปนี้:

เลือกรหัสสถานะ 2xx หรือ 3xx


3
เนื่องจากคำถามนั้นเจาะจงเกี่ยวกับชะตากรรมระหว่าง 301 ถึง 308 คุณช่วยอธิบายเพิ่มเติมเกี่ยวกับ: "ไม่อนุญาตให้เปลี่ยนวิธีการร้องขอจากPOSTเป็นGET" ได้หรือไม่ หมายความว่า dat แบบฟอร์มที่โพสต์ไม่สามารถประมวลผลได้ แต่ฟอร์มใหม่สดสามารถถูกเซิร์ฟเวอร์แล้วโพสต์ในคำขอถัดไปได้หรือไม่?
R.Schreurs

1
ข้อกำหนดฉบับร่างนี้ ( tools.ietf.org/id/draft-hunt-http-rest-redirect-00.html ) แนะนำว่าบริการ ReSTful ควรใช้ 308 แม้กระทั่งสำหรับ GET "ไม่ควรใช้รหัสการเปลี่ยนเส้นทาง HTTP 301-306 เว้นแต่ผู้ให้บริการจะทราบว่าลูกค้าเป็นตัวแทนผู้ใช้" อย่างไรก็ตามนี่เป็นเพียงร่างเท่านั้น ฉันไม่แน่ใจว่า / เมื่อไหร่จะได้รับการยอมรับ
Bruce Adams

1
โพสต์นี้the-Definitive-guide-to-get-vs-postอธิบายว่าเหตุใดจึงอนุญาตให้เปลี่ยนPOSTคำขอ (ปลอดภัย) เป็น a ถึง(ไม่ปลอดภัยในข้อมูลนั้นโดยการเพิ่มลงใน url - และสามารถบันทึก URL ได้ - รวมถึงรหัสผ่าน) คำขออาจเป็นปัญหาด้านความปลอดภัยและโดยทั่วไปควรหลีกเลี่ยงเว้นแต่คุณจะทราบว่าปลอดภัยในการเปลี่ยนแปลง ทุกวันนี้ดูเหมือนว่าโดยทั่วไปได้รับการสนับสนุนและชอบใช้ 307, 308 มากกว่า 301, 302 แต่คุณควรตรวจสอบ GET
SherylHohman

1
Mnemonic 308เป็นเหมือนอินฟินิตี้ด้านข้างดังนั้นการเปลี่ยนเส้นทางถาวรและไม่เคยเปลี่ยนวิธีการร้องขอ - มันเป็นประเภทคำขอถาวรแบบถาวร จากนั้น307เป็น1ขั้นตอนด้านล่าง - วิธีการขอถาวร / เก็บ (รับ / โพสต์) แต่เปลี่ยนเส้นทางไปยังตำแหน่งชั่วคราว: 7 - ดูเหมือน "เลี้ยวซ้าย" หรือทางอ้อมชั่วคราวและ 7 ก็คล้ายกับ k ดังนั้น "เก็บ" วิธีการร้องขอ
SherylHohman

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