У меня есть сайт, который обрабатывает "/" и "% 2F" в части пути (не в строке запроса) URL-адреса по-разному. Плохо ли это делать в соответствии с RFC или реальным миром?
Я спрашиваю, потому что я продолжаю сталкиваться с небольшими сюрпризами с веб-фреймворком, который я использую (Ruby on Rails), а также со слоями ниже этого (Passenger, Apache, например, мне пришлось включить «ALLOW_ENCODED_SLASHES» для Apache). Сейчас я склоняюсь к полному избавлению от закодированных слешей, но мне интересно, должен ли я подавать отчеты об ошибках, где я вижу странное поведение, связанное с закодированными слешами.
Что касается того, почему у меня вообще есть закодированные косые черты, в основном у меня есть такие маршруты:
:controller/:foo/:bar
где: foo - это что-то вроде пути, который может содержать косую черту. Я подумал, что самым простым решением будет просто экранировать URL foo
, чтобы косая черта игнорировалась механизмом маршрутизации. Теперь у меня есть сомнения, и довольно ясно, что фреймворки на самом деле не поддерживают это, но, согласно RFC, это неправильно делать так?
Вот некоторая информация, которую я собрал:
RFC 1738 (URL):
Обычно URL имеет ту же интерпретацию, когда октет представлен символом и когда он закодирован. Однако это не относится к зарезервированным символам: кодирование символа, зарезервированного для конкретной схемы, может изменить семантику URL.
RFC 2396 (URI):
Эти символы называются «зарезервированными», поскольку их использование в компоненте URI ограничено их зарезервированным назначением. Если данные для компонента URI будут конфликтовать с зарезервированной целью, то конфликтующие данные должны быть экранированы перед формированием URI.
(означает ли экранирование здесь что-то кроме кодирования зарезервированного символа?)
RFC 2616 (HTTP / 1.1):
Символы, отличные от символов в зарезервированных и небезопасных наборах (см. RFC 2396 [42]), эквивалентны их кодировке ""% "HEX HEX".
Существует также этот отчет об ошибках для Rails, где они, похоже, ожидают, что закодированный слеш будет вести себя по-другому:
Правильно, я бы ожидал разных результатов, потому что они указывают на разные ресурсы.
Он ищет буквальный файл 'foo / bar' в корневом каталоге. Не экранированная версия ищет панель файлов в каталоге foo.
Из RFC ясно, что raw и закодированный эквивалент для незарезервированных символов, но какова история для зарезервированных символов?