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