HTTP yönlendirme kodları arasındaki fark


151

Çeşitli HTTP 3XX yönlendirme kodları arasındaki farklar benim için net değil. Evet, spesifikasyonu okudum, ancak burada standart ve gerçek uygulama arasında bir tutarsızlık var gibi görünüyor.

301Yönlendirme kodu açık yeterince görünüyor: Kaynak kalıcı başka URI taşındı Bu araçlar, ve gelecekteki isteklerinin URI olduğunu kullanmalıdır.

Ve 307Yönlendirme kodu da açık görünüyor: Bu yönlendirme geçicidir anlamına gelir ve gelecek talepleri hala orijinal URI kullanmalısınız.

Ama aradaki fark nedir söyleyemem 302ve 303ya bunlardan birinden gerçekten farklı olmasının nedeni 301. Görünüşe göre 302başlangıçta geçici bir yönlendirme olarak tasarlanmıştı (örneğin 307), ancak pratikte çoğu tarayıcı buna bir gibi davranıyordu 303. Fakat a 303ve a arasındaki fark 301nedir? 301Yönlendirmenin daha kalıcı olduğu anlamına mı geliyor ?

Yanıtlar:


139
  • 301 : Kalıcı yönlendirme. Bu kaynak için daha sonra istekte bulunan istemciler yeni URI'yi kullanmalıdır. Müşteriler gerektiğini değil POST / PUT / DELETE istekleri için otomatik yönlendirmeyi izlemek.
  • 302 : Tanımlanmamış bir nedenden dolayı yeniden yönlendir. Müşteriler gereken bu kaynak için istek yapılmasını değil yeni URI kullanın. Müşteriler gerektiğini değil POST / PUT / DELETE istekleri için otomatik yönlendirmeyi izlemek.
  • 303 : Tanımlanmamış bir nedenden dolayı yeniden yönlendir. Genellikle, 'İşlem tamamlandı, başka bir yerde devam edin.' Müşteriler gereken bu kaynak için istek yapılmasını değil yeni URI kullanın. Müşteriler gerektiğini POST / PUT / DELETE istekleri, ama için yönlendirmeyi takip izlem istek için kullanılması GET .
  • 307 : Geçici yönlendirme. Kaynak bu konuma daha sonra geri dönebilir. Bu kaynak için daha sonra istekte bulunan istemciler eski URI'yi kullanmalıdır. Müşteriler gerektiğini değil POST / PUT / DELETE istekleri için otomatik yönlendirmeyi izlemek.

Şahsen seçim varsa 302 kaçınmak öneririz. Çoğu istemci bir 302 ile karşılaştıklarında spesifikasyona uymaz. Geçici yönlendirmeler için, GET olmayan isteklerde ne tür bir davranış istediğinize bağlı olarak 303 veya 307'yi kullanmalısınız. POST / PUT / DELETE üzerinde alternatif davranışa ihtiyacınız yoksa 307 ila 303'ü tercih edin.


26
Hayır! 303'ün ardından yöntemin GET olarak yeniden yazılması gerekir. Diğerlerini takip etmek yöntemin korunmasını gerektirir, ancak yöntemin güvenli olup olmadığını UA ile doğrulamak gerekir (bu nedenle SEÇENEKLER, KAFA, GET, PROPFIND ... dışındaki yöntemler)
Julian Reschke

1
@JulianReschke Lütfen beyannamenizi yedekleyen spesifikasyonlardaki yerleri işaret edebilir misiniz?
Piotr Dobrogost

7
@BobAman Açıklamanızda orijinal HTTP spesifikasyonunda ( RFC 1945 ) yapılan hataların aynısını yapıyorsunuz . Örneğin, Müşterilerin POST / PUT / DELETE istekleri için yönlendirmeyi izlemeleri gerektiğini söyler . 303 yönlendirme sonrasında olmadan GET yanıltıcıdır olmalıdır aşağıdaki istekte kullanılmak http fiil olduğunu belirterek ...
Piotr Dobrogost

2
Kendimi düzeltmek için: "Bir 303'ü takip etmek, ilk yöntem HEAD değilse yöntemin GET'e yeniden yazılmasını gerektirir".
Julian Reschke

2
Piotr: Varsayılan olmalıdır değil yöntemini değiştirmek için; kaynak taşındı, bu onu nasıl değiştireceğini etkilemez. 303 bir istisnadır; "kaynak taşındı" anlamına gelmez, "istek işlendi ve işte sonucunuz"; tamamen farklı bir yönlendirme türüdür. Bkz. Greenbytes.de/tech/webdav/…
Julian Reschke

84

303 ve 307 arasındaki fark şudur:

303 : Diğerlerine bakın. İstek doğru şekilde alındı, ancak sonuçlar yönlendirme URL'sinde bir GET kullanılarak alınmalıdır.

307 : Geçici yönlendirme. İsteğin tamamı yeni URL'ye yönlendirilmelidir. Tüm gönderi verileri yeniden gönderilmelidir.

302'nin 307 davranışına sahip olması gerektiğini unutmayın , ancak çoğu tarayıcı bunu 303 davranışı olarak uyguladı (her ikisi de o zamanlar mevcut değildi). Bu nedenle, bu iki yeni kod 302'nin yerine geçmiştir.

301 ve 303 arasındaki fark:

301 : Belge taşınıyor. Gelecekteki istekler yeni URL'yi kullanmalıdır. Bu url kullanılmıyor.

Not: Bu koda dikkat edin. Tarayıcılar ve proxy'ler üzerinde gerçekten agresif önbellek uygulama eğilimindedir, bu nedenle 301 ile yanıt verirseniz, birisinin bu URL'yi yeniden ziyaret etmesi uzun sürebilir.

303 : İstek doğru şekilde alındı. Tüm PUT istekleri işlenir. Ortaya çıkan belge yönlendirme URL'sinden alınabilir. Gelecekteki istek yine de orijinal URL'ye gitmelidir.


3xx (ve onunla ilgili tüm sorunlar) ayrıntılarına giren iyi bir blog yazısı: insanecoding.blogspot.no/2014/02/…
arcuri82

@ skeller88 Değişikliği cevabım yanlış yaptı, bu yüzden geri aldım (değişikliği kabul eden kişilere boo!)! Kabul edilen cevabın verdiği aynı hatayı yaptınız. 303, Julian Reschke tarafından kabul edilen cevap ve arcuri82 tarafından bağlanan blog tarafından yapılan yorumlarla teyit edildiği gibi farklı bir yönlendirme ve farklı kurallar geçerlidir
GolezTrol
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.