Чи дозволяється URL містити пробіл?


132

Чи дозволяється URI (конкретно URL-адреса HTTP), щоб містити один чи більше символів пробілу? Якщо URL-адреса має бути закодована, це +лише звичайна конвенція чи законна альтернатива?

Зокрема, чи може хтось вказати на RFC, який вказує, що URL-адреса з пробілом повинна бути закодована?

Мотивація до питання: Під час бета-тестування веб-сайту, я зазначив, що деякі URL-адреси були побудовані з пробілами. Firefox ніби зробив правильно, що мене здивувало! Але я хотів би мати можливість вказати розробникам на RFC, щоб вони відчували потребу виправити ці URL-адреси.


надбудовою , що прийшло пізніше: що все неприпустимі символи: stackoverflow.com/questions/1547899 / ...
Чіро Сантіллі郝海东冠状病六四事件法轮功

Відповіді:


101

Відповідно до RFC 1738 :

Небезпечно:

Персонажі можуть бути небезпечними з кількох причин. Символ простору небезпечний, оскільки значні пробіли можуть зникати, а незначні пробіли можуть бути введені під час транскрибування або набору URL-адрес або піддаються обробці програм для обробки тексту. Символи "<"та ">"небезпечні, оскільки вони використовуються як роздільники навколо URL-адрес у вільному тексті; лапка ( """) використовується для розмежування URL-адрес у деяких системах. Символ "#"небезпечний і його завжди слід кодувати, оскільки він використовується у всесвітній павутині та інших системах для розмежування URL-адреси від ідентифікатора фрагмента / якоря, який може слідувати за ним. Персонаж"%"небезпечно, оскільки використовується для кодування інших символів. Інші символи небезпечні, оскільки, як відомо, шлюзи та інші транспортні агенти іноді змінюють такі символи. Ці символи "{", "}", "|", "\", "^", "~", "[", "]", і "`".

Усі небезпечні символи завжди повинні бути закодовані в межах URL-адреси . Наприклад, символ "#"повинен бути закодований в URL-адресах навіть у системах, які зазвичай не мають ідентифікаторів фрагментів або якірів, так що якщо URL-адреса буде скопійована в іншу систему, яка їх використовує, не потрібно буде змінювати кодування URL-адрес.


2
1738 рік вийшов за межі 2396. ietf.org/rfc/rfc2396.txt Це поточна специфікація Uri. В цьому випадку це не має значення.
Стів Северанс

40
А 2396 витіснили 3986. Багато людей помиляються з цим, оскільки RFC незмінні, і, таким чином, не кажуть читачеві, що вони застаріли. Підказка: використовуйте tools.ietf.org/html/rfcnnnn , наприклад, tools.ietf.org/html/rfc2396 , він відображає відсутні метадані зверху.
Джуліян Решке

43

Чому це потрібно закодувати? Запит виглядає так:

GET /url HTTP/1.1
(Ignoring headers)

Є 3 поля, розділені пробілом. Якщо ви вказали пробіл у URL-адресі:

GET /url end_url HTTP/1.1

Ви знаєте, що у вас є 4 поля, сервер HTTP скаже вам, що це недійсний запит.

GET /url%20end_url HTTP/1.1

3 поля => дійсне

Примітка: у рядку запиту (після?) Пробіл зазвичай кодується як +

GET /url?var=foo+bar HTTP/1.1 

а не

GET /url?var=foo%20bar HTTP/1.1 

Що робити, якщо var дійсно був "foo + bar", а не "foo bar"?
Ivo3185

2
Я заперечую, що це вимога транспортного шару, а не самої специфікації URI. GET явно є властивістю http: специфікації, а не специфікацією URL. Так само ви можете стверджувати, що цитати в URL-адресах "must" кодуються, оскільки в іншому випадку веб-сторінки будуть порушені. Але це властивість обмежень форматування HTML (проти яких існують інші стратегії), а не властивості специфікації URL.
Кент Фредрік

ietf.org/rfc/rfc1738.txt - Небезпечні символи, включаючи пробіл) повинні бути закодовані
Жульєн

@KentFredric Це швидше за все презентаційний шар, а не транспортний шар. Як пише Жульєн (майже), оригінальна специфікація URI ( RFC 1630 ) містить це обмеження, тому воно є частиною самої специфікації URI незалежно від ваших особистих почуттів. Оскільки специфікація URI була написана після розробки проектів HTTP, цілком можливо, що URI розроблені з урахуванням HTTP, включаючи заборону на використання пробілів, але це насправді не має значення, чи не так? Правда полягає в тому, що специфіка - це те, що специфікація.
Крістофер Шульц

38

Коротша відповідь: ні, ви повинні кодувати пробіл; це є правильним для кодування простору як +, але тільки в рядку запиту; на шляху, який ви повинні використовувати %20.


1
Привіт, я теж розгублений, колись я бачив, як книга використовує "+", але колись "% 20", ви можете показати якийсь приклад для цього? Коли користувач надсилає форму, як форма кодує простір? з яким персонажем?
GMsoF

1
Додаткову інформацію див. У цій відповіді .
DavidRR

як щодо фрагмента / хеш-частини? Як пробіли повинні бути закодовані там?
gumkins

@gumkins: фрагмент (# і після) не надсилається на сервер. На практиці ви можете використовувати% 20 або + будь-де для кодування простору.
Жульєн

9

URL-адреси визначені в RFC 3986 , хоча інші RFC також є актуальними, але RFC 1738 є застарілим.

У них може не бути пробілів разом з багатьма іншими персонажами. Оскільки заборонені символи часто потрібно якось представляти, існує схема їх кодування в URL, переклавши їх у їх шістнадцятковий еквівалент ASCII з префіксом "%".

Більшість мов / платформ програмування надають функції для кодування та декодування URL-адрес, хоча вони можуть неналежним чином відповідати стандартам RFC. Наприклад, я знаю, що PHP цього не робить.


7

Так, простір зазвичай кодується до "% 20". Будь-які параметри, які переходять до URL-адреси, повинні бути закодовані, просто з міркувань безпеки.


6

URL може містити символ пробілу, і вони відображатимуться як% 20 у більшості браузерів, але правила кодування браузера змінюються досить часто, і ми не можемо залежати від того, як браузер відображатиме URL-адресу.

Тож замість цього ви можете замінити пробіл символу в URL-адресі будь-яким символом, який, на вашу думку, зробить URL-адресою більш зрозумілою та "Гарненькою";) ..... Так, загальні символи, які є кращими, є "-", "_", "+" .... але це не примуси, тому ви можете використовувати будь-який символ, який не повинен бути вже в URL-адресі.

Будь ласка, уникайте%, &,}, {,], [, /,>, <як заміни символу пробілу URL-адреси, оскільки вони можуть виявити помилку на певних браузерах та платформах.

Як ви бачите, сам перелив Stak використовує символ "-" як пробіл (% 20).

Приємного опитування.


5

У URL-адресах не повинно бути пробілів. Якщо вам потрібно звернутися до того, хто це робить, використовуйте його закодоване значення%20


5

Чи може хтось вказати на RFC із зазначенням, що URL-адреса з пробілом має бути закодована?

URI, а отже, і URL-адреси, визначені в RFC 3986.

Якщо ви подивитесь на граматику, визначену там, то врешті-решт зауважите, що пробільний символ ніколи не може бути частиною синтаксично законної URL-адреси, тому термін "URL-адреса з пробілом" сам по собі суперечить.


3

Щоб відповісти на ваше запитання. Я б сказав, що додатки досить часто замінюють пробіли у значеннях, які будуть використовуватися в URL-адресах. Причиною цього є неможливість уникнути більш важкого для читання відсотків (URI) кодування, що відбувається.

Перегляньте цю статтю у Вікіпедії про кодування відсотків .


2

Firefox 3 відобразить %20s в URL-адресах як пробіли в адресному рядку.


Це не правильна відповідь на досить просте запитання: "Is a URL allowed to contain a space?". Швидше за коментар.
Roko C.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.