У меня есть сайт, который обрабатывает "/" и "% 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 vs. encoded является эквивалентом для безоговорочных символов, но какова история зарезервированных символов?