URL кодирование: зачем нужно и как работает
Что такое URL-кодирование
URL-кодирование (percent-encoding) — это механизм преобразования символов в формат, безопасный для использования в URL-адресах. Стандарт URL (RFC 3986) разрешает использовать в адресах только ограниченный набор ASCII-символов: латинские буквы, цифры и несколько специальных символов (-, _, ., ~). Все остальные символы — включая пробелы, кириллицу, спецсимволы — должны быть закодированы.
Закодированный символ выглядит как знак процента %, за которым следуют два шестнадцатеричных числа, представляющих байт UTF-8. Например, пробел кодируется как %20, кириллическая буква «а» — как %D0%B0 (два байта UTF-8).
Зачем нужно URL-кодирование
URL имеет строгую структуру: протокол, хост, путь, параметры запроса, фрагмент. Специальные символы используются как разделители: / разделяет сегменты пути, ? начинает строку запроса, & разделяет параметры, # обозначает фрагмент. Если эти символы встречаются в данных (например, в значении параметра), они должны быть закодированы, чтобы браузер и сервер корректно разобрали URL.
Пример проблемы: допустим, вы хотите передать поисковый запрос «рубашка синяя & белая» в URL:
https://shop.ru/search?q=рубашка синяя & белая
Без кодирования браузер интерпретирует & как разделитель параметров и пробелы — как конец URL. Правильный закодированный URL:
https://shop.ru/search?q=%D1%80%D1%83%D0%B1%D0%B0%D1%88%D0%BA%D0%B0%20%D1%81%D0%B8%D0%BD%D1%8F%D1%8F%20%26%20%D0%B1%D0%B5%D0%BB%D0%B0%D1%8F
Какие символы кодируются
Символы делятся на три группы:
- Незарезервированные (unreserved) — не требуют кодирования:
A-Z,a-z,0-9,-,_,.,~. - Зарезервированные (reserved) — имеют специальное значение в URL:
:,/,?,#,[,],@,!,$,&,',(,),*,+,,,;,=. Кодируются, если используются не по назначению (например, внутри значения параметра). - Все остальные — пробелы, кириллица, иероглифы, спецсимволы — всегда кодируются.
URL-кодирование в разных языках
JavaScript
В JavaScript есть две пары функций:
encodeURIComponent()/decodeURIComponent()— кодирует значения параметров. Кодирует все спецсимволы кроме- _ . ! ~ * ' ( ).encodeURI()/decodeURI()— кодирует целый URL. Не кодирует символы-разделители (:,/,?,#,&,=).
Важно: используйте encodeURIComponent() для кодирования значений параметров и encodeURI() — для целого URL. Путаница между ними — частый источник ошибок.
PHP
urlencode() кодирует строку для использования в строке запроса (пробел заменяется на +). rawurlencode() использует %20 для пробелов, что соответствует стандарту RFC 3986.
Python
Модуль urllib.parse: quote() для кодирования компонентов пути, quote_plus() для параметров запроса (пробел как +).
Частые проблемы и их решение
- Двойное кодирование. Если данные кодируются дважды,
%20превращается в%2520. Проверяйте, не закодированы ли данные уже, прежде чем кодировать повторно. - Пробел: %20 или +? В строке запроса (query string) допустимы оба варианта, но
%20— универсален и работает в любой части URL. Символ+как пробел валиден только в application/x-www-form-urlencoded. - Кириллица в URL. Современные браузеры отображают кириллические URL красиво, но внутренне кодируют их в percent-encoding. Копируя URL из адресной строки, вы можете получить как кириллический, так и закодированный вариант.
- Некорректная кодировка. URL-кодирование предполагает UTF-8. Если исходные данные в другой кодировке (Windows-1251), результат будет неверным.
URL-кодирование и UTM-метки
При создании UTM-меток с помощью генератора UTM-меток значения параметров автоматически кодируются. Но если вы формируете URL вручную и значение содержит спецсимволы (например, название кампании «скидка 50% + подарок»), обязательно закодируйте его. Иначе % и + будут интерпретированы как управляющие символы.
URL-кодирование vs Base64
Обе техники преобразуют данные в текст, но для разных целей. URL-кодирование делает строку безопасной для использования в URL, сохраняя читаемость ASCII-символов. Base64 кодирует бинарные данные в текст для передачи через текстовые протоколы. Для передачи бинарных данных в URL часто комбинируют оба метода: сначала Base64, затем URL-кодирование (или используют вариант Base64URL).
Часто задаваемые вопросы
Зачем кодировать URL, если браузер показывает кириллицу нормально?
Браузер отображает декодированный URL для удобства пользователя, но при отправке запроса на сервер URL всегда кодируется. Проблемы возникают, когда вы формируете URL программно (в API, скриптах, email-рассылках) — там кодирование обязательно.
Как раскодировать URL?
Используйте наш инструмент URL кодирования, который поддерживает как кодирование, так и декодирование. Также в любом языке программирования есть соответствующие функции: decodeURIComponent() в JavaScript, urldecode() в PHP.
Может ли URL-кодирование использоваться для безопасности?
Нет. URL-кодирование — это не средство защиты. Злоумышленники могут использовать кодирование для обхода фильтров (например, кодируя символы SQL-инъекций). Всегда валидируйте и санитизируйте входные данные независимо от кодирования.
Какова максимальная длина URL?
Стандарт не устанавливает ограничений, но на практике: Internet Explorer поддерживал до 2083 символов, современные браузеры — до 65 000. Серверы обычно ограничивают URL до 8 КБ. Учитывая, что URL-кодирование увеличивает длину (один кириллический символ занимает 6-9 символов), это важно учитывать при формировании длинных URL.