Является ли параметр запроса 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
У мускулистого парня бандита есть имя, просто вы его не знаете. Вы знаете это по параметру, но в основном он имеет логическое значение (присутствует, отсутствует).
Vlasec

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 Spec

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

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

HTML Spec

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



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.