- Konu sahibi
- #1
HTTP 405 hatası nedir?
HTTP 405, istemcinin gönderdiği HTTP yönteminin (method) sunucunun tanıdığı bir yöntem olmasına rağmen ilgili hedef kaynak için desteklenmediği anlamına gelir. Sunucunun yöntemi hiç tanımaması 501 gibi farklı bir durumdur. Örneğin bir uç nokta yalnızca
GET kabul ederken tarayıcı, form, JavaScript kodu ya da API istemcisi POST gönderirse sunucu 405 Method Not Allowed yanıtı verebilir. Bu hata genellikle URL'nin var olduğunu, ancak kullanılan eylemin o kaynak için uygun olmadığını gösterir.Standarda göre origin sunucusu 405 yanıtında, hedef kaynağın desteklediği yöntemleri belirten
Allow başlığını üretmelidir. Örneğin Allow: GET, HEAD görülüyorsa aynı adres için POST isteği reddediliyor olabilir. Ancak bu başlığın her sunucuda doğru veya eksiksiz yapılandırılmış olması garanti değildir.Hata nasıl çalışır?
HTTP yöntemi, istemcinin kaynak üzerinde ne yapmak istediğini belirtir:
- GET: Kaynağı okumak veya listelemek için kullanılır.
- POST: Veri göndermek, işlem başlatmak veya yeni bir kayıt oluşturmak için kullanılabilir.
- PUT/PATCH: Bir kaynağı tamamen ya da kısmen güncellemek için kullanılabilir.
- DELETE: Bir kaynağı silmek için kullanılabilir.
- OPTIONS: Özellikle tarayıcıların ve CORS ön kontrol isteklerinin desteklenen yöntemleri öğrenmesi için kullanılır.
405, çoğunlukla
404 Not Found ile karıştırılır. 404 adresin bulunamadığını, 405 ise adresin tanındığını fakat gönderilen yöntemin o adres için uygun olmadığını anlatır. 403 Forbidden ise yöntem doğru olsa bile erişim izninin reddedilmesi durumudur; yine de hatalı sunucu veya uygulama yapılandırması bu kodların yanlış kullanılmasına yol açabilir.Somut örnek
Bir uygulamada
/api/kullanicilar adresi listeleme için yalnızca GET kabul etsin. JavaScript kodu yeni kullanıcı oluşturmak için aynı adrese POST gönderdiğinde sunucu 405 döndürebilir. Bu durumda sorun çoğunlukla adresin kendisi değil, şu üç noktadan biridir:- İstemci yanlış HTTP yöntemi gönderiyordur.
- Uygulamadaki rota
POSTiçin tanımlanmamıştır. - Ters vekil sunucu veya web sunucusu yöntemi uygulamaya iletmiyordur.
Yanıt başlıklarında
Allow: GET, HEAD görülüyorsa istemci, API dokümantasyonuna göre GET kullanmalı veya uygulamada POST rotası ayrıca tanımlanmalıdır. Veri değiştiren bir işlemi yalnızca hatayı susturmak için GET isteğine çevirmek doğru çözüm değildir.Teşhis ve düzeltme adımları
Önce hatanın hangi istekte oluştuğunu kesinleştirin. Tarayıcı geliştirici araçlarında Network bölümünü açıp isteğin URL'sini, yöntemini, durum kodunu ve
Allow başlığını kontrol edin. API istemcisi kullanıyorsanız aynı bilgileri istemci günlüklerinden alın.- İsteğin yöntemini ve adresini karşılaştırın. Formun
methoddeğeri, JavaScript içindekifetchveya Axios ayarı ve API dokümantasyonu aynı işlemi göstermelidir. - Aynı isteği komut satırından gözlemleyin:
curl -i -X POST https://example.com/hedef-yol. Bu biçimi yalnız kontrollü test ortamında, veri değiştirmeyeceğini bildiğiniz deneme rotasında kullanın; çalışan bir kayıt veya ödeme endpoint’ine rastgele POST göndermeyin. - Yanıtta
Allowbaşlığını ve sunucu uygulamasının hata gövdesini inceleyin. Desteklenen yöntem belirtiliyorsa istemciyi buna göre düzeltin. - Rota uygulamada mevcut olduğu halde 405 sürüyorsa web sunucusu, ters vekil, yönlendirme kuralı veya WAF yapılandırmasında yöntemin engellenip engellenmediğini kontrol edin. İsteğin üst uygulamaya gerçekten ulaştığını uygulama günlükleriyle doğrulayın.
- Sorun tarayıcıdan gönderilen
OPTIONSisteğinde oluşuyorsa CORS ön kontrol yanıtını ve sunucununOPTIONSyöntemini doğru ele alıp almadığını inceleyin. Yalnızca güvenilen kaynaklar ve gerekli yöntemler için uygun CORS politikası tanımlayın.
Komutun beklenen sonucu, hedef rotanın gerçekten
POST kabul etmediği bir durumda durum satırında 405 görülmesi ve standartta zorunlu olan Allow başlığının dönmesidir. Başlığın olmaması istemcinin yöntemi tahmin etmesi için gerekçe değil, eksik veya aracı katmanda değişmiş bir yanıt işaretidir. 404 alırsanız yol yanlış olabilir veya örnek rota mevcut değildir; 403 alırsanız erişim denetimini de incelemelisiniz. 2xx yanıtı alırsanız bu istek için 405 oluşmuyordur; tarayıcıdaki asıl isteğin yöntemi, başlıkları veya adresi farklı olabilir. curl tek başına tarayıcının CORS davranışını tam olarak taklit etmez; bu nedenle tarayıcı kaynaklı sorunları Network kaydıyla da doğrulayın.| Belirti | Muhtemel neden | İlk kontrol |
|---|---|---|
| GET çalışıyor, POST 405 dönüyor | POST rotası yok veya engelli | Uygulama rotası ve Allow başlığı |
| Tarayıcıda OPTIONS 405 | CORS ön kontrolü işlenmiyor | OPTIONS yanıtı ve CORS politikası |
| Yalnız belirli URL’lerde 405 | Yönlendirme veya proxy kuralı | Sunucu ve ters vekil günlükleri |
| Kod değişikliği sonrası başladı | Rota yöntemi veya form ayarı değişti | Son değişiklik ve dağıtılan sürüm |
Uygulama günlüğünde istek yoksa ön sunucu veya proxy’yi; istek var ama rota eşleşmiyorsa uygulama tanımını inceleyin.
Sık yapılan hatalar
Yalnız URL'yi değiştirmek: Aynı adresin sonuna başka bir yol eklemek, istemci yanlış yöntem gönderiyorsa sorunu çözmez. Yöntem ile rota tanımı birlikte kontrol edilmelidir.
POST yerine GET kullanmak: Sadece 405 kaybolsun diye kayıt oluşturma, güncelleme veya silme işlemini GET'e çevirmek; önbellekleme, bağlantı paylaşımı ve istem dışı tekrar istekler nedeniyle yanlış davranışlara yol açabilir.
CORS ile 405'i aynı şey sanmak: CORS tarayıcının izin kontrolüdür; 405 ise sunucunun yöntemi kabul etmemesidir. OPTIONS isteği başarısızsa hem CORS yanıtı hem de OPTIONS yöntemi ayrı ayrı incelenmelidir.
Her katmanda yöntemi körlemesine açmak: Web sunucusunda tüm yöntemleri serbest bırakmak, uygulamanın gerçekten desteklemediği işlemleri güvenli veya çalışır hale getirmez. Yalnızca uygulamanın ihtiyaç duyduğu yöntemleri, doğru rota üzerinde tanımlayın.