Вопрос

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

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

на самом деле представляют:

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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

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

(* 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;

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

res.redirect("/signin?email="+encodeURIComponent("aaa+bbb-ccc@example.com"));


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

Попробуйте ниже:

<script type="text/javascript">

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

Ты всегда будешь кодировать URL.

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

irb(main):008:0> CGI.escape "a.com/a+b"
=> "a.com%2Fa%2Bb"
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top