Чи справжня URL-адреса, як http://example.com/foo?bar
дійсна?
Я шукаю посилання на щось офіційне, що говорить так чи інакше. Проста відповідь "так / ні" або анекдотичні докази не вирішать це.
Чи справжня URL-адреса, як http://example.com/foo?bar
дійсна?
Я шукаю посилання на щось офіційне, що говорить так чи інакше. Проста відповідь "так / ні" або анекдотичні докази не вирішать це.
Відповіді:
URI RFC не встановлює формат рядка запиту. Хоча визнано, що рядок запиту часто несе пари іменних значень, його не потрібно (наприклад, він часто містить інший URI).
3.4. Запит
Компонент запиту містить неієрархічні дані, які поряд із даними в компоненті шляху (Розділ 3.3) служать для ідентифікації ресурсу в межах схеми URI та органу іменування (якщо він є). ...
... Однак, оскільки компоненти запиту часто використовуються для передачі ідентифікаційної інформації у вигляді пар "ключ = значення", а одне часто використовуване значення є посиланням на інший URI, ...
HTML встановлює, що форма, подана через HTTP GET, повинна кодувати значення форми як пари іменних значень у формі "? Key1 = value1 & key2 = value2 ..." (правильно закодована). Розбір рядка запиту залежить від коду на стороні сервера (наприклад, двигун сервлетів Java).
Ви не визначаєте, який саме серверний фреймворк ви використовуєте, якщо такий є, але можливо, що ваш серверний фреймворк може припустити, що рядок запиту завжди буде в парах імен-значень, і він може задавитись рядком запиту, який не є у такому форматі (наприклад ?bar
). Якщо у вашому власному власному коді розбирається рядок запиту, вам просто потрібно забезпечити обробку цього формату рядка запиту. Якщо це рамка, вам потрібно ознайомитись зі своєю документацією або просто протестувати її, щоб побачити, як вона обробляється.
isindex
Магія name
від HTML5 дозволяє відправити рядок запиту без ключа значення формату stackoverflow.com/a/37579004/895245
Вони абсолютно дійсні. Ви можете вважати їх еквівалентом великого мускулистого хлопця, який мовчки стоїть за месенджером. Хлопець не має імені і не розмовляє, але лише його присутність передає інформацію.
"Схема" http "використовується для пошуку мережевих ресурсів через протокол HTTP. У цьому розділі визначено специфічний для схеми синтаксис та семантику URL-адрес http." http://www.w3.org/Protocols/rfc2616/rfc2616.html
http_URL = "http:" "//" host [ ":" port ] [ abs_path [ "?" query ]]
Так що так, все є дійсним після знака питання. Ваш сервер може інтерпретувати по-різному, але анекдотично , ви можете бачити, що деякі мови трактують це як булеве значення, яке є істинним, якщо його вказано.
Єдина відповідна частина специфікації URI - це знати все між першим ?
і першим, що #
відповідає визначенню специфікації запиту. Він може включати будь-які символи, такі як [:/.?]
. Це означає, що рядок запиту, такий як ?bar
або ?ten+green+apples
є дійсним.
Знайдіть RFC 3986 тут
isindex
не значимо HTML5.
Він надається застарілим для використання лише як перший елемент у формі та подає без імені.
Якщо назва запису - "isindex", його тип - "текст", і це перший запис у наборі даних форми, а потім додайте значення до результату та пропустіть решту підстодій для цього запису, переходячи до наступного запис, якщо такий є, або наступний крок у загальному алгоритмі.
Прапор isindex призначений лише для спадщини. Форми у відповідності з документами HTML не генеруватимуть корисних навантажень, які потрібно декодувати за допомогою цього набору прапорців.
Востаннє підтримка isindex була HTML3 . Його використання в HTML5 полягає в тому, щоб забезпечити просту сумісність назад.
Підтримка в бібліотеках цього формату URI різна, однак деякі бібліотеки надають застарілу підтримку для полегшення використання isindex
.
Деякі бібліотеки, такі як 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.
url
(немає спеціальної підтримки)Як ще один набагато частіший приклад, він node.js
бере звичайний маршрут і полегшує аналіз як будь-якого
parseQueryString
)Більшість інших API розбору URI, що слідують за чимось подібним до цього.
parse_url
, слідує за аналогічною реалізацією, але повертає лише рядок для запиту. Розбір об'єкта k=>v
вимагаєparse_string()
Це дійсно: див. Wikipedia , RFC 1738 (3.3. HTTP) , RFC 3986 (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
Як і всі інші описані відповіді, він цілком справедливий для перевірки, спеціально для булевих матеріалів
Ось проста функція отримання рядка запиту за назвою:
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
.