使用ColdFusion重定向到UTF-8 URL

时间:2014-09-22 16:59:38

标签: redirect utf-8 coldfusion header cflocation

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

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

/geschäft/käfer/ 

如果我直接在地址栏中访问该网址,那就没问题了。 但是,如果我更改位置标题以将浏览器重定向到此URL,则结果为:

/gesch%E4ft/k%E4fer/

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

Location:/geschäft/käfer/

似乎正确的细节在标题中结束,但浏览器的地址栏显示上面详述的%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保存调用模板。

4 个答案:

答案 0 :(得分:3)

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

<cfprocessingdirective pageencoding = "utf-8"/>

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

假设您的代码中有这个,请尝试将其删除以进行重定向。如果可行,那么我会将此报告为Adobe的错误。

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

<cfprocessingdirective pageencoding = "utf-8"/>
geschäft/käfer/

我得到了

geschäft/käfer/

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

<cfprocessingdirective pageencoding = "utf-8"/>
<cflocation url="geschäft/käfer/" addtoken="false" />

它将我重新安置到

gesch%E4ft/k%E4fer/

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

geschäft/käfer/
<cfabort>

我得到了

geschäft/käfer/

但是当我这样做时 - 没有编码的重定位

<cflocation url="geschäft/käfer/" addtoken="false" />

然后我被重新安置到

geschäft/käfer/

答案 1 :(得分:2)

我已尝试过上述内容,但无法让它发挥作用。我最终做了cflocation&#34;手动&#34;。像这样:

<cfprocessingdirective pageencoding = "utf-8"/>
<cfheader charset="utf-8" name="location" value="geschäft/käfer/">
<cfheader statuscode="302">

这对我来说就像是一种魅力。

答案 2 :(得分:1)

这在ACF2018上还是无法解决的-CFHeader的变通方法可以解决问题,但是...太糟糕了。

露西(自5.3.3.62起)​​似乎也有同样的问题。我也已经向他们报告过(LDEV-2456),我们将看到他们对此有何评论。

答案 3 :(得分:1)

另一种可能的解决方法是URL编码cflocation将中断的URL部分。

例如,我有一些条件测试,如果已知参数组合不能很好地协同工作,它将进行301重定向。这些参数之一由希腊字符组成。我们的解决方案是在需要的地方使用URLEncodedFormat()。

<cfif Translation EQ "LXX" AND (URL.ot EQ "MGNT" OR URL.ot EQ "TR")>
    <cfset URL.word = URLEncodedFormat(URL.word)>
    <cflocation statuscode="301" url="/lang/lexicon/inflections.cfm?strongs=G#myStr.StrongsNum#&t=#URL.ot#&ot=#URL.ot#&word=#URL.word#" addtoken="No" />
</cfif>