Перенаправление на URL UTF-8 с ColdFusion

Я работаю в системе, которая использует символы UTF-8 в именах папок для URL. Там не было никаких проблем при переходе по этим 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 с IIS7.5

РЕДАКТИРОВАТЬ: Кажется, эта проблема может быть связана непосредственно с ColdFusion. Если я использую Javascript для перенаправления на URL, это работает... с оговоркой, что файл должен быть сохранен с спецификацией. Если я использую cflocationили если я использую pagecontext для вставки заголовка вручную, проблема не устраняется независимо от наличия спецификации.

Я также заметил похожую проблему с использованием cfinclude в том смысле, что эти расширенные символы отображаются неправильно, если вызывающий шаблон не сохранен в спецификации.

2 ответа

Решение

Я пошел, чтобы проверить это и не увидел тот же результат. Но потом я немного поиграл с ним и попробовал использовать

<cfprocessingdirective pageencoding = "utf-8"/>

Сразу же я смог увидеть ту же проблему, что и вы. Кажется естественным включить его на любой странице. Это очень умозрительно, но CFAS может выполнять некую кодировку URL в теге cflocation при использовании вместе с директивой pageencoding.

Предполагая, что это где-то есть в вашем коде, попробуйте удалить его для перенаправления. Если это работает, то я бы сообщил об этом как об ошибке в 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">

Это сработало как обаяние для меня.

Другой возможный обходной путь - URL-кодирование частей URL-адреса, которые cflocation нарушит.

Например, у меня есть условное тестирование, которое будет перенаправлять 301, если известно, что комбинация параметров не работает вместе. Один из этих параметров состоит из греческих символов. Наше решение - использовать URL EncodedFormat() там, где это необходимо.

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

Это все еще не работает в ACF2018 - обходной путь CFHeader помогает, но... фу...

Похоже, что у Люси (начиная с версии 5.3.3.62) такая же проблема.. Я им тоже сообщил (LDEV-2456), посмотрим, что они скажут по этому поводу.

Другие вопросы по тегам