使用ColdFusion重定向到UTF-8 URL

Gar*_*ton 6 coldfusion redirect header utf-8 cflocation

我正在开发一个在URL的文件夹名称中使用UTF-8字符的系统.导航到这些URL没有问题,一切都按预期工作 - 除非在网站上发布重定向到另一个页面; 因此浏览器似乎编码扩展字符.

举个例子,我试图重定向到以下相对URL:

/geschäft/käfer/ 
Run Code Online (Sandbox Code Playgroud)

如果我直接在地址栏中访问该URL,则没有问题.但是,如果我更改位置标题以将浏览器重定向到此URL,则最终会:

/gesch%E4ft/k%E4fer/
Run Code Online (Sandbox Code Playgroud)

如果我查看原始页面的响应标题(它是301重定向到翻译的内容),我可以看到这个条目:

Location:/geschäft/käfer/
Run Code Online (Sandbox Code Playgroud)

似乎正确的细节在标题中结束,但浏览器的地址栏显示上面详述的%E4的编码值.我尝试了各种方法将URL输入到位置标题中,但所有方法都得到了相同的结果.

我在Chrome 37.0.2062.120 m和Firefox 32.0.2上看到了这种行为.

这是在一个开发盒上运行,Windows 7 Home with IIS7.5

编辑: 似乎这个问题可能与ColdFusion直接相关.如果我使用Javascript重定向到网址,这可行......但需要注意的是文件必须与BOM一起保存.如果我使用cflocation,或者如果我使用pagecontext手动插入标题,则无论是否存在BOM,问题都会持续存在.

我还注意到使用的类似问题,cfinclude除非使用BOM保存调用模板,否则这些扩展字符显示不正确.

Ger*_*ich 3

我去测试了一下,没有看到相同的结果。但后来我又玩了一下并尝试使用

\n\n
<cfprocessingdirective pageencoding = "utf-8"/>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我立刻就看到了与您完全相同的问题。将其包含在任何页面中似乎很自然。这是非常推测的,但当与 pageencoding 指令结合使用时,CFAS 可能会在 cflocation 标记中进行某种 URL 编码。

\n\n

假设您的代码中某处有此内容,请尝试将其删除以进行重定向。如果可行,我会将此作为错误报告给 Adob​​e。

\n\n

仅供参考,我这样做了——带编码的输出

\n\n
<cfprocessingdirective pageencoding = "utf-8"/>\ngesch\xc3\xa4ft/k\xc3\xa4fer/\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到了

\n\n
gesch\xc3\xa4ft/k\xc3\xa4fer/\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是当我这样做时——使用编码重新定位

\n\n
<cfprocessingdirective pageencoding = "utf-8"/>\n<cflocation url="gesch\xc3\xa4ft/k\xc3\xa4fer/" addtoken="false" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

它把我重新安置到

\n\n
gesch%E4ft/k%E4fer/\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我这样做时——没有编码的输出

\n\n
gesch\xc3\xa4ft/k\xc3\xa4fer/\n<cfabort>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我有

\n\n
gesch\xc3\x83\xc2\xa4ft/k\xc3\x83\xc2\xa4fer/\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是当我这样做时——不编码重定位

\n\n
<cflocation url="gesch\xc3\xa4ft/k\xc3\xa4fer/" addtoken="false" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我被搬迁到

\n\n
gesch\xc3\xa4ft/k\xc3\xa4fer/\n
Run Code Online (Sandbox Code Playgroud)\n