Apakah valid memiliki lebih dari satu tanda tanya di URL?

92

Saya menemukan URL berikut hari ini:

http://www.sfgate.com/cgi-bin/blogs/inmarin/detail??blogid=122&entry_id=64497

Perhatikan tanda tanya ganda di awal string kueri:

??blogid=122&entry_id=64497

Browser saya sepertinya tidak mengalami masalah dengan itu, dan menjalankan bookmarklet cepat:

javascript:alert(document.location.search);

baru saja memberi saya string kueri yang ditunjukkan di atas.

Apakah ini URL yang valid? Alasan mengapa saya terlalu bertele-tele (dengan asumsi saya) adalah karena saya perlu mengurai URL seperti ini untuk parameter kueri, dan mendukung tanda tanya ganda akan memerlukan beberapa perubahan pada kode saya. Jelas jika mereka berada di alam liar, saya harus mendukung mereka; Saya terutama ingin tahu apakah itu kesalahan saya karena tidak mematuhi standar URL dengan tepat, atau apakah itu sebenarnya URL non-standar.

Mengerjakan dgn kurang baik
sumber
Untungnya, meskipun demikian, saya tidak perlu mengubah kode saya. Saya menggunakan indexOf()untuk menemukan tanda tanya, sehingga mengambil posisi kejadian pertama. Kemudian saya memisahkan query_parameters di masing &- masing dan kemudian pasangan nama / nilai mereka di masing-masing =.
Bungle

Jawaban:

108

Ya, ini valid. Hanya yang pertama ? dalam URL yang memiliki signifikansi, setelah itu diperlakukan sebagai tanda tanya literal:

Komponen kueri ditunjukkan dengan karakter tanda tanya pertama ("?") Dan diakhiri dengan karakter tanda angka ("#") atau di akhir URI.

...

Karakter garis miring ("/") dan tanda tanya ("?") Mungkin mewakili data dalam komponen kueri. Berhati-hatilah karena beberapa implementasi yang lebih lama dan keliru mungkin tidak menangani data tersebut dengan benar saat digunakan sebagai URI dasar untuk referensi relatif (Bagian 5.1), tampaknya karena gagal membedakan data kueri dari data jalur saat mencari pemisah hierarkis. Namun, karena komponen kueri sering digunakan untuk membawa informasi pengenal dalam bentuk pasangan "key = value" dan satu nilai yang sering digunakan adalah referensi ke URI lain, terkadang lebih baik kegunaannya untuk menghindari% encoding karakter tersebut.

http://tools.ietf.org/html/rfc3986#section-3.4

Amber
sumber
9
Jadi, apakah itu berarti parameter kueri pertama dinamai "? Blogid" dan bukan "blogid"? Itu bisa menyenangkan ...
GalacticCowboy
3
@GalacticCowboy - Ya, hal yang sama baru saja terjadi pada saya. Anda benar - Firebug mengonfirmasi bahwa parameter kueri pertama memang benar ?blogid. Ini sebenarnya tampak sebagai parameter yang tidak penting, yaitu halaman disajikan sama dengan sejumlah tanda tanya di sana, atau mengabaikan parameter sepenuhnya.
Bungle
27

Sebagai jawaban yang berhubungan secara tangensial, foo?spam=1?&eggs=3berikan parameter spamnilai1?

Hilton Shumway
sumber
Iya. jika tidak ada .htaccessatau trik serupa. jika kita mengubah fooke script.phpdan membuat permintaan ini script.php?spam=1?&eggs=3kemudian var_dump($_GET)menunjukkanarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Hebe