405 Method Not Allowed: Arti dan Cara Mengatasinya

Advertisement
Apa Itu Error 405 Method Not Allowed?
405 Method Not Allowed adalah kode status HTTP yang berarti server mengenali alamat yang Anda minta, tetapi tidak mengizinkan metode yang dipakai permintaan Anda. RFC 9110 (bagian 15.5.6) mendefinisikannya sebagai metode yang "known by the origin server but not supported by the target resource", yaitu dikenal oleh server asal tetapi tidak didukung oleh resource tujuan.
Setiap permintaan HTTP punya metode: GET untuk membaca halaman, POST untuk mengirim formulir atau membuat sesuatu, PUT dan PATCH untuk memperbarui, DELETE untuk menghapus, dan OPTIONS untuk menanyakan apa yang diizinkan. Kode 405 berarti URL-nya ada, tetapi tidak untuk metode tersebut. Jika URL-nya sama sekali tidak ada, Anda akan mendapat 404.
Karena error ini menyangkut cara permintaan dibuat, bukan halaman yang hilang, 405 hampir selalu harus diperbaiki oleh developer situs. Pengunjung biasanya menemuinya setelah mengirim formulir atau mengikuti tautan yang sudah usang.
Tampilan Error 405
| Server / framework | Pesan khas |
|---|---|
| nginx | 405 Not Allowed (dengan tulisan nginx di bawahnya) |
| Apache | Method Not Allowed. The requested method POST is not allowed for this URL. |
| IIS | HTTP Error 405.0 - Method Not Allowed. The page you are looking for cannot be displayed because an invalid method (HTTP verb) is being used. |
| Next.js / API | Respons kosong atau JSON dengan status 405, sering hanya terlihat di DevTools |
| Konsol browser (CORS) | Error CORS, karena preflight OPTIONS menerima 405 |
Advertisement
Langkah 1: Baca Header Allow
Tanyakan ke server metode apa saja yang diterima untuk URL itu. Kirim permintaan OPTIONS, atau ulangi permintaan yang gagal sambil menampilkan header-nya:
# Metode apa saja yang diterima URL ini?
curl -i -X OPTIONS https://example.com/api/contact
# Ulangi permintaan yang gagal, lalu lihat status dan header Allow
curl -i -X POST https://example.com/api/contact -d 'name=test'
# HTTP/2 405
# allow: GET, HEADAlat HTTP Headers dari DNS Robot menampilkan kode status dan header yang dikembalikan sebuah URL untuk permintaan GET biasa, yang berguna saat Anda memeriksa halaman di browser, bukan API.
Tidak semua server mengikuti aturan ini. Halaman 405 bawaan nginx, misalnya, dikirim tanpa header Allow, jadi di nginx Anda perlu memeriksa blok location mana yang menangani URL tersebut (Solusi 2).
Jika Anda Pengunjung
Kembali dan muat ulang halaman, lalu kirim formulirnya lagi. Formulir yang dimuat dari salinan cache lama bisa mengirim data ke alamat yang sudah berubah.
Jangan refresh setelah mengirim formulir. Me-refresh halaman hasil pengiriman formulir bisa mengirim ulang POST ke URL yang hanya menerima GET.
Periksa alamatnya apakah ada salah ketik, atau buka beranda situs dan navigasikan ulang.
Laporkan. Jika formulir di situs selalu gagal, pemilik situs yang perlu memperbaikinya, jadi kirimkan alamat halamannya kepada mereka.
Advertisement
Solusi 1: Kirim Metode yang Benar ke URL yang Benar
Penyebab paling umum di kode hanyalah ketidakcocokan: formulir atau panggilan fetch() memakai POST padahal endpoint hanya menerima GET, atau permintaan dikirim ke URL halaman, bukan URL API. Bandingkan metode di kode Anda dengan header Allow dan dokumentasi API-nya.
// Endpoint ini hanya mengizinkan POST, jadi GET (bawaan fetch) menghasilkan 405
const res = await fetch("/api/contact", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ name: "Ana" }),
})
if (res.status === 405) console.log("Allowed:", res.headers.get("allow"))Solusi 2: nginx Mengembalikan 405 untuk POST ke File Statis
Handler file statis nginx hanya melayani GET dan HEAD. POST ke file .html, atau ke location yang menyajikan file alih-alih meneruskan permintaan ke aplikasi Anda, akan mendapat 405 Not Allowed. Ini sering terjadi ketika action sebuah formulir mengarah ke halaman statis, atau ketika blok location yang ditujukan untuk aplikasi Anda tidak cocok.
Solusi sebenarnya adalah mengirim POST ke aplikasi (PHP, Node, Python) dengan proxy_pass atau fastcgi_pass di blok location yang tepat. Periksa blok mana yang menangani URL tersebut:
# Kiriman formulir harus sampai ke aplikasi, bukan ke handler file statis
location /api/ {
proxy_pass http://127.0.0.1:3000;
}
# Uji dan reload setelah ada perubahan
# sudo nginx -t && sudo systemctl reload nginxAdvertisement
Solusi 3: IIS Memblokir PUT dan DELETE (WebDAV)
Di server Windows yang menjalankan IIS, modul WebDAV mengambil alih verb PUT dan DELETE, sehingga REST API (ASP.NET Web API dan lainnya) menjawab HTTP Error 405.0 untuk keduanya. Jika Anda tidak memakai WebDAV, hapus modul itu untuk situs Anda di web.config:
<system.webServer>
<modules>
<remove name="WebDAVModule" />
</modules>
<handlers>
<remove name="WebDAV" />
</handlers>
</system.webServer>Periksa juga pengaturan Request Filtering situs di IIS Manager (tab HTTP Verbs), yang bisa langsung menolak metode tertentu (IIS melaporkannya sebagai 404.6, bukan 405).
Solusi 4: Tambahkan Metode ke Route Handler Anda
Framework mengembalikan 405 ketika sebuah route ada tetapi tidak punya handler untuk metode yang dipakai:
Next.js (App Router):
route.tshanya menjawab metode yang diekspornya. Jika file itu mengeksporGETtetapi tidakPOST, permintaan POST menghasilkan 405. Tambahkanexport async function POST(request: Request) { … }.Flask: secara bawaan, route hanya menerima GET. Gunakan
@app.route("/contact", methods=["GET", "POST"]).Django: class-based view mengembalikan 405 untuk metode yang tidak punya handler yang cocok (tambahkan method
post()), dan dekoratorrequire_http_methodsmelakukan hal yang sama.Express: secara bawaan, metode yang tidak cocok akan jatuh ke 404, bukan 405. Jika API Anda seharusnya mengembalikan 405, tambahkan handler penampung (catch-all) yang mengatur header
Allow.
Advertisement
Solusi 5: Tangani Permintaan Preflight CORS (OPTIONS)
Ketika halaman web memanggil API di domain lain dengan JSON atau header khusus, browser lebih dulu mengirim permintaan preflight OPTIONS. Jika API menjawab permintaan OPTIONS itu dengan 405, browser melaporkan error CORS dan tidak pernah mengirim permintaan yang sebenarnya, padahal endpoint aslinya akan berfungsi.
Buat API menjawab OPTIONS untuk route tersebut dengan 204 atau 200 beserta header Access-Control-Allow-Methods dan Access-Control-Allow-Headers yang tepat. Sebagian besar framework punya middleware CORS yang melakukannya untuk Anda. Contohnya, DNS Lookup API milik DNS Robot sendiri menjawab preflight dengan 204 dan header CORS, sehingga browser bisa memanggilnya dari situs mana pun.
405 vs 400, 403, 404, dan 501
| Kode | Arti |
|---|---|
| 405 Method Not Allowed | URL-nya ada, tetapi tidak untuk metode ini |
| 400 Bad Request | Permintaannya sendiri tidak valid |
| 403 Forbidden | Server memahami permintaan Anda tetapi tidak mengizinkan akses |
| 404 Not Found | Tidak ada apa pun di URL ini |
| 501 Not Implemented | Server tidak mendukung metode ini untuk URL mana pun |
Panduan terkait: 400 Bad Request, 403 Forbidden, dan 401 Unauthorized.
Periksa apa yang dikembalikan sebuah URL
HTTP Headers Checker dari DNS Robot menampilkan kode status dan header respons untuk URL apa pun, sehingga Anda bisa memastikan 405 dan melihat perangkat lunak server di baliknya.
Coba HTTP Headers CheckerAdvertisement
Pertanyaan yang Sering Diajukan
Artinya server mengenali URL-nya tetapi tidak menerima metode HTTP yang dipakai, misalnya POST yang dikirim ke halaman yang hanya mengizinkan GET. Responsnya seharusnya menyertakan header Allow yang mencantumkan metode yang diterima URL tersebut.