Чи допустимий параметр запиту URL, якщо він не має значення?


138

Чи справжня URL-адреса, як http://example.com/foo?barдійсна?

Я шукаю посилання на щось офіційне, що говорить так чи інакше. Проста відповідь "так / ні" або анекдотичні докази не вирішать це.


3
Окрім URI RFC, я хочу зазначити реальний приклад цього світу. Drupal використовує ці безцінні параметри запиту в деяких посиланнях як форму перебору кешу. наприклад, www.google-analytics.com/analytics.js?o490ub або /themes/seven/ie.css?o4eppb. Ви, мабуть, це вже знаєте, але деякі натрапляння на це можуть не робити.
Ілля Лінн

Відповіді:


103
  • Дійсний до URI RFC
  • Ймовірно, прийнятний для вашого сервера фреймворк / код

URI RFC не встановлює формат рядка запиту. Хоча визнано, що рядок запиту часто несе пари іменних значень, його не потрібно (наприклад, він часто містить інший URI).

3.4. Запит

Компонент запиту містить неієрархічні дані, які поряд із даними в компоненті шляху (Розділ 3.3) служать для ідентифікації ресурсу в межах схеми URI та органу іменування (якщо він є). ...

... Однак, оскільки компоненти запиту часто використовуються для передачі ідентифікаційної інформації у вигляді пар "ключ = значення", а одне часто використовуване значення є посиланням на інший URI, ...

HTML встановлює, що форма, подана через HTTP GET, повинна кодувати значення форми як пари іменних значень у формі "? Key1 = value1 & key2 = value2 ..." (правильно закодована). Розбір рядка запиту залежить від коду на стороні сервера (наприклад, двигун сервлетів Java).

Ви не визначаєте, який саме серверний фреймворк ви використовуєте, якщо такий є, але можливо, що ваш серверний фреймворк може припустити, що рядок запиту завжди буде в парах імен-значень, і він може задавитись рядком запиту, який не є у такому форматі (наприклад ?bar). Якщо у вашому власному власному коді розбирається рядок запиту, вам просто потрібно забезпечити обробку цього формату рядка запиту. Якщо це рамка, вам потрібно ознайомитись зі своєю документацією або просто протестувати її, щоб побачити, як вона обробляється.


7
ASP.NET MVC (наскільки мені відомо версії 4 та 5), безумовно, задихається, коли значення не надається :(
AR

2
isindexМагія nameвід HTML5 дозволяє відправити рядок запиту без ключа значення формату stackoverflow.com/a/37579004/895245
Чіро Сантіллі郝海东冠状病六四事件法轮功


80

Вони абсолютно дійсні. Ви можете вважати їх еквівалентом великого мускулистого хлопця, який мовчки стоїть за месенджером. Хлопець не має імені і не розмовляє, але лише його присутність передає інформацію.


19
М'язистий хлопець мафіози має ім'я, ви просто не знаєте цього. Ви знаєте це на параметрі, і в основному він має булеве значення (присутній, відсутній).
Власек

2
Найкращий спосіб описати це :)
Мохаммад Кермані

1
Звали великого хлопця Чейх , з цього епізоду пограбування казино на Star Trek: Deep Space 9.
Ентоні

8

"Схема" http "використовується для пошуку мережевих ресурсів через протокол HTTP. У цьому розділі визначено специфічний для схеми синтаксис та семантику URL-адрес http." http://www.w3.org/Protocols/rfc2616/rfc2616.html

http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]] 

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


6
Для формального визначення див. RFC 2396 ( ietf.org/rfc/rfc2396.txt ), який не вмикає вміст рядка запиту, окрім того, щоб вказати юридичний набір символів та тих, які мають особливе значення. Зокрема, в ньому йдеться про те, що "компонент запиту - це рядок інформації, яку слід інтерпретувати ресурсом", маючи на увазі, що його визначення залежить від протоколу, і, таким чином, ключ = значення значною мірою визначається умовою.
RobertB

6

Так, це дійсно.

Якщо потрібно просто перевірити, чи існує параметр чи ні, це один із способів.


4

Спектр URI

Єдина відповідна частина специфікації URI - це знати все між першим ?і першим, що #відповідає визначенню специфікації запиту. Він може включати будь-які символи, такі як [:/.?]. Це означає, що рядок запиту, такий як ?barабо ?ten+green+applesє дійсним.

Знайдіть RFC 3986 тут

Спеціалізація HTML

isindex не значимо HTML5.

Він надається застарілим для використання лише як перший елемент у формі та подає без імені.

Якщо назва запису - "isindex", його тип - "текст", і це перший запис у наборі даних форми, а потім додайте значення до результату та пропустіть решту підстодій для цього запису, переходячи до наступного запис, якщо такий є, або наступний крок у загальному алгоритмі.

Прапор isindex призначений лише для спадщини. Форми у відповідності з документами HTML не генеруватимуть корисних навантажень, які потрібно декодувати за допомогою цього набору прапорців.

Востаннє підтримка isindex була HTML3 . Його використання в HTML5 полягає в тому, щоб забезпечити просту сумісність назад.

Підтримка в бібліотеках

Підтримка в бібліотеках цього формату URI різна, однак деякі бібліотеки надають застарілу підтримку для полегшення використання isindex.

Perl URI.pm (спеціальна підтримка)

Деякі бібліотеки, такі як URI Perl, надають методи розбору подібних структур

$uri->query_keywords
$uri->query_keywords( $keywords, ... )
$uri->query_keywords( \@keywords )
Sets and returns query components that use the keywords separated by "+" format.

Node.js url(немає спеціальної підтримки)

Як ще один набагато частіший приклад, він node.jsбере звичайний маршрут і полегшує аналіз як будь-якого

  • Рядок
  • або, об'єкт ключів і значень (використовуючи parseQueryString)

Більшість інших API розбору URI, що слідують за чимось подібним до цього.



3

isindexзастаріла магія nameвід HTML5

Ця застаріла функція дозволяє подачі форми генерувати таку URL-адресу, надаючи додаткові докази того, що вона дійсна для HTML. Наприклад:

<form action="#isindex" class="border" id="isindex" method="get">
  <input type="text" name="isindex" value="bar"/>
  <button type="submit">Submit</button>
</form>

генерує URL-адресу типу:

?bar

Стандарт: https://www.w3.org/TR/html5/forms.html#naming-form-controls:-the-name-attribute

isindexОднак застаріло, як згадується на веб- сайті: https://stackoverflow.com/a/41689431/895245


1

Як і всі інші описані відповіді, він цілком справедливий для перевірки, спеціально для булевих матеріалів

Ось проста функція отримання рядка запиту за назвою:

function getParameterByName(name, url) {
    if (!url) {
        url = window.location.href;
    }
    name = name.replace(/[\[\]]/g, "\\$&");
    var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
        results = regex.exec(url);
    if (!results) return null;
    if (!results[2]) return '';
    return decodeURIComponent(results[2].replace(/\+/g, " "));
}

і тепер ви хочете перевірити, чи шукаєте рядок запиту, чи ні, ви можете зробити просту річ, наприклад:

var exampleQueryString = (getParameterByName('exampleQueryString') != null);

exampleQueryStringбуде , falseякщо функція не може знайти рядок запиту, в іншому випадку буде true.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.