Обратите внимание, что 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 (что здесь не применимо).