Должны ли мы кодировать косые черты в поисковой части URL? - PullRequest
3 голосов
/ 15 сентября 2011

rfc 1738 не является точным в отношении кодирования прямой косой черты в «поисковой части»:

Если в схеме зарезервирован символ, соответствующий октету, то октетдолжны быть закодированы.

...

могут использоваться только буквенно-цифровые символы, специальные символы "$ -_. +! * '()," и зарезервированные символы, используемые для их зарезервированных целей.не закодирован в URL.

...

В компонентах path и searchpart, "/", ";", "?"зарезервированы.

Знаете ли вы, что такое «зарезервированная цель» для «/» в поисковой части URL-адресов?

Есть ли реальная причина следовать спецификации и кодироватьпрямые косые черты, при условии, что мой сервер обрабатывает некодированные косые черты?

Это сводит меня с ума, когда мне нужно постоянно декодировать параметры URL, которые являются буквенно-цифровыми с косыми чертами.

Вот пример из жизни:

http://localhost/login?url=/a/path/to/protected/content

против

http://localhost/login?url=%2Fa%2Fpath%2Fto%2Fprotected%2Fcontent"

1 Ответ

2 голосов
/ 03 июля 2012

Обратите внимание, что RFC 3986 обновляет RFC 1738 (хотя и не устарел, что, я думаю, указывает на то, что оно предназначено для разъяснения, а не противоречия).

В разделе 3.4 RFC 3986 говорится, что синтаксис части query URI:

query       = *( pchar / "/" / "?" )

ABNF для URI удобно собирать в Приложении A, в котором указано

pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
pct-encoded   = "%" HEXDIG HEXDIG
unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
              / "*" / "+" / "," / ";" / "="

Это довольно однозначно указывает на то, что косые черты являются законными в части запроса, и поэтому не нуждаются в кодировании. В частности, ваш пример http://localhost/login?url=/a/path/to/protected/content в порядке, как и http://localhost/login?abc123-.+~!$&'()*+,;=%00/?:@

В разделе 2.4 указано, что символы необходимо кодировать только тогда, когда требуется включить зарезервированные символы в часть URI (что здесь не применимо).

...