EncodeFor
应该使用哪个location()
?
如果我想通过位置推送一些数据,它应该是什么样?
location("obtainBDK.cfm?message=#ErrorMessage#", false); // nothing
OR
location("obtainBDK.cfm?message=#EncodeForHTMLAttribute(ErrorMessage)#", false);
OR
location("obtainBDK.cfm?message=#EncodeForURL(ErrorMessage)#", false);
OR
还有什么?
答案 0 :(得分:4)
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
将空格编码为%20
(percent-encoded)encodeForUrl
将空格编码为+
(application/x-www-form-urlencoded)尽管...
我遇到了+
不能正确区分是空格还是实际加号的问题,尤其是在上下文更改时(CF <-> JS)。因此,无论Adobe对此有何看法,我都会推荐urlEncodedFormat
。