6

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

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

/geschäft/käfer/ 

如果我直接在地址栏中访问该 URL,则没有问题。但是,如果我更改位置标头以将浏览器重定向到此 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 重定向到 url,这可行……但需要注意的是,文件必须与 BOM 一起保存。如果我使用cflocation,或者如果我使用 pagecontext 手动插入标题,则无论是否存在 BOM,问题都会持续存在。

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

4

4 回答 4

3

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

<cfprocessingdirective pageencoding = "utf-8"/>

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

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

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

<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/

当我这样做时--Output without encoding

geschäft/käfer/
<cfabort>

我有

geschäft/käfer/

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

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

然后我被调到

geschäft/käfer/
于 2014-09-23T11:15:19.420 回答
2

我已经尝试了上述方法,但无法使其正常工作。我最终“手动”进行了 cflocation 。像这样:

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

这对我来说就像一个魅力。

于 2015-03-04T10:05:01.820 回答
1

这仍然被 ACF2018 打破 - CFHeader 变通办法可以解决问题,但是......糟糕......

看来 Lucee(截至 5.3.3.62)也有同样的问题。我也向他们报告过(LDEV-2456),我们将看看他们对此有何评论。

于 2019-09-11T17:02:06.247 回答
1

另一个可能的解决方法是对 cflocation 将破坏的 URL 部分进行 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>
于 2019-11-13T19:32:08.173 回答