Косая черта («/») эквивалентна косой черте («% 2F») в части пути URL-адреса HTTP

У меня есть сайт, который обрабатывает «/» и «% 2F» в части пути (не в строке запроса) URL-адреса по-разному. Это плохо делать в соответствии с RFC или реальным миром?

Я спрашиваю, потому что я продолжаю сталкиваться с небольшими сюрпризами с веб-фреймворком, который я использую (Ruby on Rails), а также со слоями ниже этого (Passenger, Apache, например, мне пришлось включить «ALLOW_ENCODED_SLASHES» для Apache). Сейчас я склоняюсь к полному избавлению от закодированных слешей, но мне интересно, должен ли я подавать отчеты об ошибках, где я вижу странное поведение, связанное с закодированными слешами.

Что касается того, почему у меня в первую очередь закодированные косые черты, в основном у меня есть такие маршруты:

:controller/:foo/:bar

где: foo - это что-то вроде пути, который может содержать косую черту. Я думал, что самое простое, что нужно сделать, это просто убежать URLfoo поэтому косые черты игнорируются механизмом маршрутизации. Теперь у меня есть сомнения, и довольно ясно, что фреймворки на самом деле не поддерживают это, но, согласно 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 и закодированный эквивалент для незарезервированных символов, но какова история для зарезервированных символов?

Ответы на вопрос(5)

Ваш ответ на вопрос