HTTPQUERY
Bahasa Indonesia

405 Method Not Allowed

Penggunaan

Ketika error 405 Method Not Allowed datang, klien memahami bahwa sumber daya tersebut ada, tetapi metode yang ditentukan tidak diizinkan. Sebagai bagian dari respons, server mengirimkan header Allow yang mencantumkan metode-metode yang saat ini didukung untuk sumber daya tersebut.

Dampak SEO

Mesin pencari seperti Google tidak mengindeks URL yang mengembalikan status 405. URL yang sebelumnya terindeks dan mengembalikan status code ini akan dihapus dari hasil pencarian.

Contoh

Klien mencoba melakukan DELETE pada sumber daya yang hanya-baca. Server merespons dengan 405 Method Not Allowed dan menyertakan header Allow yang menunjukkan bahwa hanya GET, HEAD, dan OPTIONS yang diizinkan.

Permintaan

DELETE /policies.pdf HTTP/1.1
Host: example.com

Respons

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS
Content-Type: text/html
Content-Length: 157

<html>
  <head>
    <title>Operation Not Permitted</title>
  </head>
  <body>
    <p>This resource is read-only and cannot be
    deleted.</p>
  </body>
</html>

Cara memperbaiki

405 Method Not Allowed berarti sumber daya tersebut ada, tetapi tidak mendukung metode HTTP yang ada pada permintaan.

Periksa header Allow pada respons. Server menyertakan header ini untuk mencantumkan setiap metode yang diizinkan bagi sumber daya tersebut. Beralihlah ke salah satu metode yang tercantum. Periksa header tersebut dengan curl -I atau di DevTools browser pada bagian Response Headers.

Beralih ke metode yang benar. Kesalahan yang umum adalah mengirim POST ke endpoint hanya-baca atau GET ke endpoint pengiriman data. Sesuaikan metode dengan operasi yang dijelaskan pada dokumentasi API. Pengiriman form secara bawaan menggunakan GET kecuali atribut method disetel ke post.

Verifikasi dokumentasi endpoint API. REST API mendefinisikan metode spesifik untuk setiap path sumber daya. Pastikan kombinasi path dan metode tersebut valid. Ketidakcocokan trailing slash antara /api/users dan /api/users/ dirutekan ke handler yang berbeda pada banyak framework, dan salah satu path menerima metode tersebut sementara yang lain tidak.

Periksa konfigurasi server untuk pembatasan metode. Direktif web server membatasi metode yang diizinkan per location. Di Apache, blok dan mengontrol akses berdasarkan metode:

<LimitExcept GET HEAD OPTIONS>
    Require all denied
</LimitExcept>

Di nginx, direktif limit_except memberikan hasil yang sama:

location /api {
    limit_except GET POST {
        deny all;
    }
}

Sesuaikan direktif tersebut agar mengizinkan metode yang dimaksud.

Tangani permintaan preflight CORS. Permintaan lintas asal memicu preflight OPTIONS sebelum metode yang sebenarnya dikirim. Server harus merespons OPTIONS dengan header Access-Control-Allow-Methods yang benar dan mencantumkan metode yang diizinkan. Konfigurasi CORS yang hilang atau tidak lengkap mengembalikan 405 untuk preflight tersebut. Di nginx:

add_header Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS";

Tinjau routing framework aplikasi. Framework web (Django, Rails, Express, Spring) hanya mendaftarkan route untuk metode yang dideklarasikan secara eksplisit. Decorator route atau aksi controller yang hilang untuk metode yang diminta akan menghasilkan 405. Pastikan definisi route cocok dengan metode HTTP yang dimaksud.

Periksa kemungkinan gangguan dari server file statis. nginx secara bawaan melayani file statis dan menolak permintaan POST ke sumber daya statis. Ketika POST ditujukan untuk backend aplikasi, pastikan blok location merutekan permintaan tersebut ke aplikasi upstream alih-alih ke handler file statis.

Referensi kode

.NET

HttpStatusCode.MethodNotAllowed

Rust

http::StatusCode::METHOD_NOT_ALLOWED

Rails

:method_not_allowed

Go

http.StatusMethodNotAllowed

Symfony

Response::HTTP_METHOD_NOT_ALLOWED

Python3.5+

http.HTTPStatus.METHOD_NOT_ALLOWED

Java

java.net.HttpURLConnection.HTTP_BAD_METHOD

Apache HttpComponents Core

org.apache.hc.core5.http.HttpStatus.SC_METHOD_NOT_ALLOWED

Angular

@angular/common/http/HttpStatusCode.MethodNotAllowed