Перенаправление на 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), посмотрим, что они скажут по этому поводу.