Какие существуют ограничения у URL (Uniform Resource Locator)?

Ответ

URL имеет несколько ключевых ограничений, связанных с длиной, допустимыми символами и структурой.

1. Ограничение длины

Максимальная длина не определена в стандарте, но ограничена реализациями: Компонент Типичное ограничение
Браузеры (Chrome, Firefox, Safari) ~32 000 символов (практический лимит ~2000 для надежности)
Серверы (Apache, Nginx) Задается в конфигурации, обычно 8 192 – 16 384 символов.
Internet Explorer (устаревший) 2 083 символа.

2. Допустимые символы

В URL можно использовать только ограниченный набор символов из ASCII. Остальные должны быть закодированы (URL-encoded, или percent-encoding):

  • Зарезервированные символы: ! * ' ( ) ; : @ & = + $ , / ? % # [ ] – имеют специальное значение.
  • Недопустимые символы: пробел, <, >, ", {, }, |, , ^, `. Пробел кодируется как %20 или +.

3. Структурные ограничения

  • Схема (protocol): http:, https:, ftp:, mailto: и др.
  • Хост (hostname): Длина доменного имени ограничена 253 символами (включая точки).
  • Порт (port): Число от 1 до 65535.

Пример кодирования URL в Python:

from urllib.parse import quote, urlencode

# Кодирование части URL (например, значения параметра)
query = "тест & проверка"
encoded_query = quote(query, safe='')  # safe='' указывает, что кодировать всё
print(encoded_query)  # %D1%82%D0%B5%D1%81%D1%82%20%26%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0

# Создание полного URL с параметрами
base_url = "https://api.example.com/search"
params = {"q": "тест запрос", "page": 1}
full_url = f"{base_url}?{urlencode(params, encoding='utf-8')}"
print(full_url)  # https://api.example.com/search?q=%D1%82%D0%B5%D1%81%D1%82+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81&page=1

Почему это важно: Превышение лимитов или использование недопустимых символов приводит к ошибкам 414 URI Too Long или 400 Bad Request. Для передачи больших объемов данных следует использовать тело запроса (например, POST).

Ответ 18+ 🔞

А, вот эта тема про URL, да? Ну, слушай, тут такая хуйня, блядь. Это как бы адресок в интернете, но он, сука, с характером. Ограничения у него, как у злой тёщи — и длину не переборщи, и слова подбирай аккуратно, а то получишь по ебалу ошибкой 400.

Первое — длина, блядь.
В теории-то ограничения нет, но на практике — везде свои приколы. Представь, ты пишешь письмо, а конверт — хуй с горы, маленький.
Вот браузеры (Хром, Фаерфокс) вроде и выдержат тысяч 32 символов, но лучше не ебать мозги и укладываться в пару тысяч, а то сломается всё.
А старый добрый Internet Explorer, тот вообще мудак шерстяной — больше 2083 символов не проглотит, и всё, пиздец, нахуй.
Сервера (Apache, Nginx) тоже не сахар — обычно им больше 8-16 тысяч символов в рот не впихнёшь, конфигом надо ковыряться.

Второе — какие буквы можно.
Тут вообще ёперный театр. Можно только английские буковки, циферки и пару символов. Всё остальное — подлежит кодированию, блядь.
Пробел? А хуй там! Либо %20, либо плюсик ставь.
Скобки, решётки, собачки (@) — всё это зарезервированные символы, у них своя роль.
А если ты туда русские буквы или, не дай бог, смайлик сунешь — получишь абракадабру вида %D0%BF%D1%80%D0%B8%D0%B2%D0%B5%D1%82. Это и есть percent-encoding, ёпта.

Третье — структура.
Тут как паспорт: должен быть протокол (https:), хост (доменное имя, не длиннее 253 символов, включая точки, блядь), и порт (от 1 до 65535, как номера квартир).

Вот, смотри, как на Python эту хуйню кодировать, чтобы сервер не взбесился:

from urllib.parse import quote, urlencode

# Допустим, у нас запрос "тест & проверка". Без кодирования это пиздец, символ & сломает всё.
query = "тест & проверка"
encoded_query = quote(query, safe='')  # safe='' — значит, кодируем всё, даже то, что можно было бы оставить
print(encoded_query)  # Выведет: %D1%82%D0%B5%D1%81%D1%82%20%26%20%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0

# А теперь соберём целый URL с параметрами, как нормальные люди
base_url = "https://api.example.com/search"
params = {"q": "тест запрос", "page": 1}
full_url = f"{base_url}?{urlencode(params, encoding='utf-8')}"
print(full_url)  # https://api.example.com/search?q=%D1%82%D0%B5%D1%81%D1%82+%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81&page=1

А теперь главное, нахуй: если ты попробуешь впихнуть невпихуемое (слишком длинный URL или кривые символы), сервер тебе вежливо так ответит: «414 URI Too Long» или «400 Bad Request». По-русски это значит: «Иди нахуй, распиздяй, переделывай».
Для передачи овердохуища данных используй тело запроса, например, POST. Не надо выёбываться с гигантскими URL, это моветон, блядь.