Mengapa persen masuk ke URL menyebabkan kesalahan Permintaan 400 HTTP Buruk?

22

Saya menemukan ini secara tidak sengaja ketika salah ketik URL untuk halaman web di browser web saya.

Mengapa mengunjungi http://example.com/%menyebabkan kesalahan HTTP 400 Bad Requested untuk dilemparkan? Apakah server mengharapkan sesuatu yang lain setelah atau sebelum tanda persen?

Tampaknya terjadi untuk server Apache dan Nginx.

iglvzx
sumber

Jawaban:

32

Jawaban singkat

Sesuai RFC 3986 , %karakter kosong bukan sintaks URI yang valid ; itu harus diikuti oleh dua digit heksadesimal yang berarti .

Jawaban panjang

The HTTP kode status Anda punya milik 4xxkelas:

4xx: Client Error - The request contains bad syntax or cannot be fulfilled

Sumber: Hypertext Transfer Protocol (HTTP) Status Code Registry

Secara khusus, kode 400ditentukan oleh Internet Engineering Task Force (IETF) di RFC 2616:

10.4.1 400 Permintaan Buruk

Permintaan tidak dapat dipahami oleh server karena sintaksis yang salah. Klien TIDAK HARUS mengulangi permintaan tanpa modifikasi.

Sumber: RFC 2616 - Protokol Transfer Hiperteks - HTTP / 1.1

Mengutip Wikipedia (cetak tebal):

Karakter yang diizinkan dalam URI yang baik dilindungi atau tanpa pagu ( atau karakter persen sebagai bagian dari persen-encoding ).

Sumber: Persen-encoding - Persen-encoding dalam URI

Jika Anda ingin menyisipkan literal %simbol, Anda perlu menggunakan representasi persen-dikodekan nya: %25.

Bacaan lebih lanjut

and31415
sumber
Saya tidak mengerti. Jika saya menutupi tanda '%' dengan '% 25' file tersebut masih belum ditayangkan tetapi kesalahan 400 akan dilemparkan ke dalam skenario kami (Apache -> JKMount -> Tomcat)
fiffy
Jika Anda memiliki RewriteRule berikut RewriteRule (.*) xyz/$1(di mana xyz adalah nama folder apa pun) di .htaccess, Anda harus menggandakan- enkode% sebagai% 2525.
Marco Marsala
9

Tanda persen adalah untuk menyisipkan karakter yang biasanya tidak didukung di url. Misalnya% 20 sama dengan spasi.

LPChip
sumber
4
Dan untuk memasukkan karakter persen itu sendiri, itu%25
Robotnik
A +adalah cara pintas untuk menyandikan spasi. Jika Anda ingin tanda tambah nyata, gunakan kode heksnya,% 2B.
Phil Perry
3
+ adalah penyandian yang benar untuk spasi hanya dalam string kueri. % 20 adalah penyandian yang benar di tempat lain dalam url.
Eden Townsend