Access-Control-Allow-Methods
Penggunaan
Sebelum mengirim permintaan lintas origin dengan metode non-sederhana, browser mengeluarkan permintaan preflight OPTIONS. Header Access-Control-Request-Method dalam preflight tersebut menunjukkan metode mana yang hendak digunakan klien. Server membalas dengan Access-Control-Allow-Methods untuk menegaskan metode mana saja yang diterima untuk sumber daya target.
Metode sederhana (GET, HEAD, dan POST) selalu diizinkan oleh protokol CORS dan tidak secara ketat perlu dicantumkan di sini. Mencantumkannya secara eksplisit adalah praktik yang umum dan membuat kebijakan server terlihat sekilas pandang.
Beberapa metode ditulis sebagai daftar yang dipisahkan koma.
Daftar nama metode
Sekumpulan nama metode HTTP yang dipisahkan koma, yang diterima server untuk akses lintas origin.
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
* (wildcard)
Tanda bintang berperan sebagai wildcard untuk permintaan tanpa kredensial, sehingga mengizinkan metode apa pun.
Access-Control-Allow-Methods: *
Catatan
Untuk permintaan berkredensial, wildcard * diperlakukan sebagai string literal, bukan sebagai wildcard. Setiap metode yang diizinkan harus dicantumkan secara eksplisit ketika kredensial hadir.
Contoh
Sebuah permintaan preflight menanyakan apakah metode PUT diizinkan. Server menegaskan beberapa metode.
Permintaan
OPTIONS /api/resource/42 HTTP/1.1
Origin: https://example.com
Access-Control-Request-Method: PUT
Respons
HTTP/1.1 204 No Content
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Methods: GET, POST, PUT, DELETE
Access-Control-Max-Age: 7200
Server yang lebih ketat hanya mengizinkan GET dan POST.
Access-Control-Allow-Methods: GET, POST
Pemecahan masalah
Kegagalan preflight yang berkaitan dengan metode HTTP memblokir permintaan lintas origin yang sesungguhnya sebelum server memproses operasi yang dimaksud.
Konsol menampilkan “Method PUT is not allowed by Access-Control-Allow-Methods in preflight response.” Server tidak menyertakan metode yang diminta dalam nilai Access-Control-Allow-Methods. Tambahkan metode yang hilang tersebut ke respons preflight. Di nginx: add_header Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”; Di Apache: Header set Access-Control-Allow-Methods “GET, POST, PUT, DELETE, PATCH”
Respons preflight sama sekali tidak memuat header tersebut. Penangan OPTIONS ada, tetapi tidak mengembalikan Access-Control-Allow-Methods. Pastikan rute preflight menyetel header ini bersama Access-Control-Allow-Origin dan Access-Control-Allow-Headers. Header metode yang hilang menyebabkan browser menolak metode non-sederhana apa pun.
Wildcard * tidak bekerja dengan permintaan berkredensial. Ketika Access-Control-Allow-Credentials bernilai true, wildcard diperlakukan sebagai string literal * dan tidak cocok dengan metode mana pun. Cantumkan setiap metode yang diizinkan secara eksplisit pada konfigurasi berkredensial.
Server mengembalikan 405 Method Not Allowed selama preflight. Server tidak memiliki rute yang menangani OPTIONS untuk URL target, sehingga permintaan tersebut mengenai catch-all yang menolak metode itu. Tambahkan penangan OPTIONS pada rute tersebut. Di Express: app.options(‘/api/resource’, cors()). Di Django, middleware django-cors-headers menangani OPTIONS secara otomatis setelah dipasang. Di nginx, tambahkan blok if ($request_method = OPTIONS) atau gunakan limit_except untuk mengizinkan OPTIONS pada location tersebut.
Framework menangani OPTIONS secara otomatis tetapi tidak menyertakan header CORS. Sebagian framework merespons OPTIONS dengan 200 atau 204 dan header Allow biasa yang mencantumkan metode yang didukung, tetapi tidak melampirkan header CORS apa pun. Browser memperlakukan ini sebagai preflight yang gagal karena Access-Control-Allow-Methods tidak ada. Konfigurasikan middleware CORS agar mencegat permintaan OPTIONS sebelum penangan bawaan framework. Di Spring Boot, daftarkan sebuah bean CorsFilter. Di ASP.NET, panggil services.AddCors() dengan kebijakan yang benar sebelum app.UseRouting().