URL-адреса и знаки плюс

Мне известно, что + в строке запроса URL-адреса представляет пробел. Это также случай вне области строки запроса? То есть имеет следующий URL-адрес:

http://a.com/a+b/c

фактически представляют:

http://a.com/a b/c

(и, следовательно, необходимо закодировать, если оно действительно должно быть +), или фактически оно представляет a+b/c?

Ответ 1

  • Ожидается, что будет декодироваться процентная кодировка в разделе пути URL-адреса, но
  • любые символы + в компоненте пути, как ожидается, будут обрабатываться буквально.

Чтобы быть явным: + является только специальным символом в компоненте запроса.

Ответ 2

Вы можете найти хороший список соответствующих URL-символов, закодированных в W3Schools.

  • + становится %2B
  • пробел становится %20

Ответ 3

Символы пробела могут быть закодированы только как "+" в одном контексте: пары ключ-значение для приложений /x -www-form-urlencoded.

RFC-1866 (спецификация HTML 2.0), пункт 8.2.1. в подпункте 1 говорится: "Имена полей и значения полей формы экранированы: символы пробела заменены на" + ", а затем зарезервированные символы экранируются" ).

Вот пример такой строки в URL-адресе, где RFC-1866 разрешает кодирование пробелов как плюсы: " http://example.com/over/there?name=foo+bar". Итак, только после "?", Пробелы могут быть заменены на плюсы (в других случаях пробелы должны быть закодированы до %20). Этот способ кодирования данных формы также приведен в более поздних спецификациях HTML, например, искать соответствующие абзацы о приложении /x -www-form-urlencoded в спецификации HTML 4.01 и т.д.

Но, поскольку трудно всегда правильно определить контекст, лучше никогда не кодировать пробелы как "+". Лучше всего процитировать весь символ, кроме "безоговорочного", определенного в RFC-3986, с .2.3. Вот пример кода, который иллюстрирует, что должно быть закодировано. Он задан на языке программирования Delphi (pascal), но очень легко понять, как он работает для любого программиста, независимо от языка:

(* percent-encode all unreserved characters as defined in RFC-3986, p.2.3 *)
function UrlEncodeRfcA(const S: AnsiString): AnsiString;
const    
  HexCharArrA: array [0..15] of AnsiChar = '0123456789ABCDEF';
var
  I: Integer;
  c: AnsiChar;
begin
 // percent-encoding, see RFC-3986, p. 2.1
  Result := S;
  for I := Length(S) downto 1 do
  begin
    c := S[I];
    case c of
      'A' .. 'Z', 'a' .. 'z', // alpha
      '0' .. '9',             // digit
      '-', '.', '_', '~':;    // rest of unreserved characters as defined in the RFC-3986, p.2.3
      else
        begin
          Result[I] := '%';
          Insert('00', Result, I + 1);
          Result[I + 1] := HexCharArrA[(Byte(C) shr 4) and $F)];
          Result[I + 2] := HexCharArrA[Byte(C) and $F];
        end;
    end;
  end;
end;

function UrlEncodeRfcW(const S: UnicodeString): AnsiString;
begin
  Result := UrlEncodeRfcA(Utf8Encode(S));
end;

Ответ 4

используйте функцию encodeURIComponent для исправления url, она работает в браузере и node.js

res.redirect("/signin?email="+encodeURIComponent("[email protected]"));


> encodeURIComponent("http://a.com/a+b/c")
'http%3A%2F%2Fa.com%2Fa%2Bb%2Fc'

Ответ 5

Попробуйте следующее:

<script type="text/javascript">

function resetPassword() {
   url: "submitForgotPassword.html?email="+fixEscape(Stringwith+char);
}
function fixEscape(str)
{
    return escape(str).replace( "+", "%2B" );
}
</script>

Ответ 6

Вы всегда должны кодировать URL-адреса.

Вот как Ruby кодирует ваш URL-адрес:

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"