Чи дійсно мати більше одного знака питання в URL-адресі?


91

Сьогодні я натрапив на таку URL-адресу:

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

Зверніть увагу на подвоєний знак питання на початку рядка запиту:

??blogid=122&entry_id=64497

Здається, у мого браузера не було проблем із цим, і він запустив швидкий букмарклет:

javascript:alert(document.location.search);

щойно дав мені рядок запиту, показаний вище.

Це дійсна URL-адреса? Причина, по якій я настільки педантична (припускаючи, що я є), полягає в тому, що мені потрібно проаналізувати такі URL-адреси для параметрів запиту, а підтримка подвоєних знаків запитання потребує деяких змін у моєму коді. Очевидно, якщо вони перебувають у дикій природі, мені потрібно буде їх підтримати; Мені в основному цікаво, чи це моя вина за те, що я точно не дотримуюсь стандартів URL, чи насправді це нестандартна URL-адреса.


На щастя, незважаючи на це, мені не потрібно було міняти свій код. Я використовував indexOf()для пошуку знака запитання, тому він зайняв позицію першого входження. Потім я розділяю параметри query_parametre на кожен, &а потім їх пари ім'я / значення на кожному =.
Бангл

Відповіді:


107

Так, це дійсно. Тільки перший ? у URL-адресі має значення, будь-який після нього розглядається як буквальний знак питання:

Компонент запиту позначається першим знаком питання ("?") І завершується символом цифри ("#") або кінцем URI.

...

Коса коса риса ("/") та знак запитання ("?") Можуть представляти дані всередині компонента запиту. Пам'ятайте, що деякі старі помилкові реалізації можуть неправильно обробляти такі дані, коли вони використовуються як базовий URI для відносних посилань (Розділ 5.1), мабуть, тому, що вони не можуть розрізнити дані запиту від даних шляху при пошуку ієрархічних роздільників. Однак, оскільки компоненти запиту часто використовуються для передачі ідентифікаційної інформації у формі пар "ключ = значення", і одне з часто використовуваних значень є посиланням на інший URI, іноді краще для зручності уникати відсоткового кодування цих символів.

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


9
То чи це означає, що перший параметр запиту має назву "? Blogid", а не "blogid"? Це може бути весело ...
GalacticCowboy

3
@GalacticCowboy - Так, те саме мені просто спало на думку. Ви маєте рацію - Firebug підтверджує, що перший параметр запиту насправді ?blogid. Насправді це, здається, несуттєвий параметр, тобто сторінка подається однаково з будь-якою кількістю знаків запитання там, або повністю опускаючи параметр.
Бангл

26

Як тангенціально відповідна відповідь foo?spam=1?&eggs=3дає параметру spamзначення1?


так. на випадок, якщо немає .htaccessабо подібних прийомів. якщо ми перейдемо fooна script.phpта зробимо цей запит, script.php?spam=1?&eggs=3тоді буде var_dump($_GET)показаноarray(2) { ["spam"]=> string(2) "1?" ["eggs"]=> string(1) "3" }
Гебе
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.