Допустим ли параметр запроса url, если он не имеет значения?

Действителен ли URL типа http://example.com/foo?bar?

Я ищу ссылку на что-нибудь официальное, в котором говорится так или иначе. Простой ответ да / нет или анекдотические свидетельства не помогут.


person Conley Owens    schedule 29.12.2010    source источник
comment
В дополнение к URI RFC я хочу указать на реальный пример этого. Drupal использует эти бесполезные параметры запроса в некоторых ссылках как форму очистки кеша. например www.google-analytics.com/analytics.js?o490ub или /themes/seven/ie.css?o4eppb. Вы, вероятно, уже знаете это, но некоторые спотыкания могут и не знать.   -  person Elijah Lynn    schedule 22.03.2016


Ответы (8)


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

URI RFC не требует обязательного формата для строки запроса. Хотя известно, что строка запроса часто содержит пары имя-значение, это не обязательно (например, она часто будет содержать другой URI).

3.4. Запрос

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

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

HTML устанавливает, что форма, отправленная через HTTP GET должен кодировать значения формы как пары имя-значение в форме «? ключ1 = значение1 & ключ2 = значение2 ...» (правильно закодировано). Анализ строки запроса выполняется серверным кодом (например, механизмом сервлетов Java).

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

person Bert F    schedule 29.12.2010
comment
ASP.NET MVC (насколько мне известно, версии 4 и 5) определенно задыхается, когда значение не указано :( - person A.R.; 09.09.2015
comment
isindex magic name из HTML5 позволяет отправлять строку запроса без формата "ключ-значение" stackoverflow.com/a/37579004/895245 - person Ciro Santilli 新疆再教育营六四事件ۍ 02.06.2016
comment
@CiroSantilli 烏坎 事件 2016 六四 事件 法轮功 как устаревшая функция для устаревшей поддержки HTML3 - person Evan Carroll; 17.01.2017

Они совершенно верны. Вы могли бы считать их эквивалентом большого мускулистого парня, молча стоящего позади гонца мафии. У парня нет имени и он не говорит, но одно его присутствие передает информацию.

person Marc B    schedule 29.12.2010
comment
У мускулистого парня бандита есть имя, просто вы его не знаете. Вы знаете это по параметру, но в основном он имеет логическое значение (присутствует, отсутствует). - person Vlasec; 16.02.2016
comment
Лучше всего это описать :) - person Mohammad Kermani; 21.02.2017
comment
Этого здоровяка зовут Чич из эпизода ограбления казино в Star Trek: Deep Space 9. - person Anthony Rutledge; 12.05.2019

«Схема« http »используется для поиска сетевых ресурсов по протоколу HTTP. В этом разделе определяется специфический для схемы синтаксис и семантика для URL-адресов http». http://www.w3.org/Protocols/rfc2616/rfc2616.html

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

Итак, да, все, что угодно, стоит после вопросительного знака. Ваш сервер может интерпретировать это по-разному, но вы можете случайно увидеть, что некоторые языки трактуют это как логическое значение, которое истинно, если оно указано.

person Jeff Ferland    schedule 29.12.2010
comment
Формальное определение см. В RFC 2396 (ietf.org/rfc/rfc2396.txt ), который ничего не говорит о содержимом строки запроса, кроме указания допустимого набора символов и тех, которые имеют особое значение. В частности, он говорит, что компонент запроса - это строка информации, которая должна интерпретироваться ресурсом, подразумевая, что его определение зависит от протокола, и, таким образом, key = value в основном определяется соглашением. - person RobertB; 29.12.2010

Да, это действительно так.

Если кто-то просто хочет проверить, существует ли параметр или нет, это один из способов сделать это.

person Oded    schedule 29.12.2010

Спецификация URI

Единственная важная часть спецификации URI - знать все между первым ? и первым #, соответствует определению запроса в спецификации. Он может включать любые символы, например [:/.?]. Это означает, что допустима строка запроса, например ?bar или ?ten+green+apples.

Найдите RFC 3986 здесь

Спецификация HTML

isindex не имеет смысла HTML5.

Он предоставляется устаревшим для использования только в качестве первого элемента в форме и отправляется без имени.

Если имя записи «isindex», ее тип - «текст», и это первая запись в наборе данных формы, затем добавьте значение к результату и пропустите остальные подшаги для этой записи, переходя к следующей запись, если таковая имеется, или следующий шаг в общем алгоритме в противном случае.

Флаг isindex предназначен только для устаревшего использования. Формы в соответствующих документах HTML не будут генерировать полезные данные, которые необходимо декодировать с помощью этого флага.

В последний раз isindex поддерживался HTML3. Он используется в HTML5 для упрощения обратной совместимости.

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

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

Perl URI.pm (специальная поддержка)

Некоторые библиотеки, такие как Perl URI, предоставляют методы синтаксического анализа структур такого типа.

$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 следуют примерно такому же принципу.

person Evan Carroll    schedule 17.01.2017

Это действительно так: см. Википедию, RFC 1738 (3.3. HTTP), RFC 3986 (3. Компоненты синтаксиса).

person thirtydot    schedule 29.12.2010
comment
Обратите внимание, что RFC 2396 изменяет и заменяет общие определения в RFC 1738 и RFC 1808. - person RobertB; 29.12.2010

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

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 01.06.2016

Как описано во всех других ответах, это вполне допустимо для проверки, особенно для логических вещей

Вот простая функция для получения строки запроса по имени:

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.

person Mohammad Kermani    schedule 21.02.2017