cflocation
/ location
устанавливает HTTP-заголовок Location
.Браузер считывает это значение и запрашивает упомянутый ресурс через HTTP GET.Указанный URI должен быть закодирован.
Теперь единственная часть URI, которая требует кодирования, - это строка запроса, которая начинается со знака вопроса ?
.Каждая пара ключ-значение состоит из закодированного ключа, знака равенства =
и закодированного значения.Несколько пар разделяются амперсандом &
.
Согласно RFC 1738 :
Таким образом, только буквенно-цифровые символы, специальные символы "$ -_.+! * '(), "и зарезервированные символы, используемые для их зарезервированных целей, могут использоваться без кодировки в URL.
Пример зарезервированных символов
Uncocoded URI:
http://example.org/path?&=&&===&?
Ожидаемые пары ключ-значение:
- "&": "&"
- "=": "="
- "?": ""
Однако правильный синтаксический анализатор будет видеть только пустые ключи и значения.Нам необходимо закодировать ключи и значения, чтобы они не обрабатывались по их техническому назначению.
Кодированный URI: http://example.org/path?%26=%26&%3D=%3D&%3F&%20=%20!
Теперь все символы в ключе и значении кодируются в процентах в соответствии с RFC 3986 и не может быть ошибочно обработан синтаксическим анализатором.
ColdFusion:
kvps = [];
key = "message";
val = ErrorMessage;
kvps.append(
urlEncodedFormat(key) & "=" & urlEncodedFormat(val)
);
targetUrl = "btainBDK.cfm?" & arrayToList(kvps, "&");
location(targetUrl, false);
urlEncodedFormat и encodeForUrl
Хотя ...
Adobe рекомендует использовать функцию EncodeForURL, а не функцию URLEncodedFormat, чтобы экранировать специальные символы в строке для использования в URL-адресе ввсе новые приложения.
Я столкнулся с проблемами, когда +
не может быть должным образом различен между пробелом или фактическим знаком плюс, особенно при изменении контекста (CF <-> JS),Поэтому я бы порекомендовал urlEncodedFormat
независимо от мнения Adobe об этом.