Посібник

Кодування URL: Повний посібник

URL кодування (також відоме як percent-encoding) є фундаментальною частиною веб-розробки, але його часто неправильно розуміють або неправильно використовують. Правильне кодування URL гарантує, що ваші веб-додатки правильно обробляють спеціальні символи, міжнародний текст та складні параметри запитів. Цей посібник пояснює все, що потрібно знати про кодування URL.

Що таке кодування URL?

URL кодування - це механізм для представлення символів у URL у безпечному, передаваному форматі. URL можуть містити лише певні ASCII символи. Будь-який символ поза цим обмеженим набором повинен бути закодований.

Процес працює шляхом заміни небезпечних або зарезервованих символів знаком відсотка (%) з двома шестнадцятковими цифрами, що представляють байтове значення символу у UTF-8. Наприклад, пробіл стає %20, а символ @ стає %40.

Чому це необхідно? URL мають специфічний синтаксис з зарезервованими символами, які мають спеціальні значення. Символ ? розділяє шлях від параметрів запиту. Символ & розділяє параметри запиту. Символ = розділяє імена параметрів від значень. Символ # позначає фрагменти. Символ / розділяє сегменти шляху. Якщо ці символи з'являються у ваших даних (не як частина URL синтаксису), вони повинні бути закодовані для запобігання неправильної інтерпретації.

Міжнародні символи (кирилиця, китайські ієрогліфи, емодзі, акценти) не входять в ASCII взагалі і завжди повинні кодуватися в URL. Текст "Київ" стає "%D0%9A%D0%B8%D1%97%D0%B2", де кожна пара представляє один байт UTF-8 кодування.

Різні частини URL мають різні правила кодування. Шлях URL має один набір безпечних символів. Параметри запиту мають трохи інший набір. URL фрагменти мають свої власні правила. Розуміння цих відмінностей запобігає поширеним багам.

Коли кодувати URL

Завжди кодуйте динамічно згенерований вміст, який вставляється в URL. Якщо ви приймаєте введення користувача та включаєте його в URL, ви повинні кодувати його. Якщо ви будуєте параметри запиту з даних бази даних або відповідей API, кодуйте значення.

Параметри запиту особливо потребують кодування. Коли ви будуєте URL типу example.com/search?q=user input, значення 'user input' повинно бути закодовано. Якщо користувач шукає "cats & dogs", некодований URL example.com/search?q=cats & dogs порушиться, тому що & розділяє параметри. Правильно закодований: example.com/search?q=cats%20%26%20dogs.

Компоненти шляху з спеціальними символами також потребують кодування. URL типу example.com/users/John Doe/profile повинен стати example.com/users/John%20Doe/profile. Пробіли у шляхах особливо проблематичні.

Ніколи не кодуйте вручну побудовані статичні URL. Якщо ви пишете href="https://example.com/about", не кодуйте його. Кодуйте лише динамічні частини: href="https://example.com/search?q=" + encodeURIComponent(userQuery).

Не подвійно кодуйте. Якщо дані вже закодовані, не кодуйте їх знову. Подвійне кодування перетворює %20 (закодований пробіл) на %2520, що декодується назад до %20, а не до пробілу. Це поширена помилка у багатошарових додатках.

URL з фрагментами (хеш-символ) потребують особливої уваги. У example.com/page#section name, "section name" повинно бути закодовано як example.com/page#section%20name.

Найкращі практики

Використовуйте правильну функцію для правильного контексту. У JavaScript: encodeURIComponent() для окремих параметрів запиту або значень - кодує майже все. encodeURI() для повних URL - зберігає URL синтаксис типу :, /, ?, & незакодованим. Ніколи не використовуйте escape() - це застаріла, не-стандартна функція.

У Python використовуйте urllib.parse.quote() для компонентів шляху, urllib.parse.quote_plus() для параметрів запиту (кодує пробіли як +), urllib.parse.urlencode() для повних рядків запиту. У PHP використовуйте urlencode() для параметрів запиту, rawurlencode() для RFC 3986 відповідності.

Завжди кодуйте на найнижчому можливому рівні - настільки близько до побудови URL, наскільки можливо. Це запобігає випадковому подвійному кодуванню та робить зрозумілим, що саме кодується. Ніколи не припускайте, що дані вже закодовані, якщо ви не маєте повного контролю.

Будьте обережні з формами та відправкою POST. Браузери автоматично кодують дані форм, але використовують різне кодування (application/x-www-form-urlencoded) з пробілами як + замість %20. Якщо ви вручну будуєте POST тіла, переконайтеся, що ви використовуєте правильний формат.

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

Для міжнародних доменних імен (IDN) типу "münchen.de", використовуйте Punycode кодування для частини доменного імені (xn--mnchen-3ya.de), але стандартне URL кодування для частини шляху та запиту.

Тестуйте з крайніми випадками: пробіли, спеціальні символи (&, =, ?, #), кирилиця, китайські ієрогліфи, емодзі, дуже довгі рядки, порожні рядки, символи NULL. Кожен з них може викрити проблеми кодування.

Спробувати інструмент

URL Encoder/Decoder

URL Encoder/Decoder

Дізнатися більше

Часті питання

URL Encoder/Decoder

Часті питання