我正在开发一个在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米和Firefox 32.0.2上看到了这种行为。
这是在一个开发盒上运行的,Windows 7 Home with IIS7.5
编辑:这个问题似乎与ColdFusion直接相关。如果我使用Javascript重定向到url,这很有效。。。但需要注意的是,该文件必须与BOM一起保存。如果我使用cflocation
,或者如果我使用页面上下文手动插入标题,则无论是否存在BOM,问题都会持续存在。
我还注意到了使用cfinclude
时的一个类似问题,即除非调用模板与BOM一起保存,否则这些扩展字符将不正确地显示。
我去测试了一下,没有看到相同的结果。但后来我又玩了一点,并尝试使用
<cfprocessingdirective pageencoding = "utf-8"/>
很快,我就看到了与你完全相同的问题。把它包括在任何一页中似乎都很自然。这是非常推测性的,但是当与pageencoding指令一起使用时,CFAS可能在cflocation标记中进行某种URL编码。
假设你在代码中的某个地方有这个,试着删除它进行重定向。如果这样做有效,那么我会把它作为一个bug报告给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/
我已经尝试过上面的方法,但它无法正常工作。我最终"手动"完成了cflocation。像这样:
<cfprocessingdirective pageencoding = "utf-8"/>
<cfheader charset="utf-8" name="location" value="geschäft/käfer/">
<cfheader statuscode="302">
这对我来说很有魅力。
ACF2018仍然打破了这一点-CFHeader的解决方案起到了作用,但。。。是的。。
Lucee(截至5.3.3.62)似乎也存在同样的问题。。我也已经向他们报告了(LDEV-2456),我们将看看他们对此有何看法。
另一个潜在的解决方案是对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>