Как перенаправить на URL с неанглийскими символами?

1

Я использую пилоны, и некоторые из моих URL-адресов содержат неанглийские символы, например:

http://localhost:5000/article/111/文章标题

В большинстве случаев это не проблема, но в моем модуле регистрации после выхода пользователя из системы я пытаюсь получить referer из request.headers и перенаправить на этот URL.

if user_logout:
    referer = request.headers.get('referer', '/')
    redirect(referer)

К сожалению, если url содержит неанглийские символы и с помощью браузера IE, он сообщит об этой ошибке (Firefox в порядке):

  WebError Traceback:
  UnicodeDecodeError: 'ascii' codec can't decode byte 0xd5 in position 140: ordinal not in range(128) 
View as:   Interactive (full)  |  Text (full)  |  XML (full) clear this 
clear this 
URL: http://localhost:5000/users/logout

Module weberror.evalexception:431 in respond          view

Есть способ исправить это (но не полезно), используйте urllib.quote() для преобразования URL-адреса перед перенаправлением.

referer = quote_path(url) # only quote the path of the url
redirect(referer)

Это нехорошее решение, потому что оно работает только в том случае, если brower IE, и очень скучно. Есть ли хорошее решение?

Теги:
url
non-english
pylons
webob

3 ответа

0
Лучший ответ

Наконец, я до сих пор не нашел хорошего решения и использую этот код:

referer = urllib.quote(referer, '.:/?=;-%#')

Кажется, сейчас хорошо, но я не чувствую себя в безопасности.

  • 0
    Это правильный способ сделать это, вы должны закодировать каждый не ASCII символ в URL. Это в спецификации HTTP.
1

Попробуйте проверить RFC для URL-адресов, отличных от ascii. Если я правильно помню, они преобразуются в эквивалент ascii. Затем вы можете перенаправить на это.

Изменить: Согласно @ssokolov (см. комментарии ниже):

Конкретными условиями поиска являются IDN (Интернационализированные имена доменов) и Punycode

  • 0
    Это делает это преобразование: referer = quote_path (url)
  • 1
    Конкретные термины для поиска - это IDN (интернационализированные доменные имена) и Punycode.
0

Перенаправление работает, создавая исключение. Это поймано и преобразовано в HTTP-ответ Как насчет указания кодировки для вашего ответа?

response.charset = 'utf8'

  • 0
    Плохие новости: я установил response.charset='utf8' , даже request.charset='utf8'
  • 0
    Это означает, что сам URL не кодируется правильно. Исправление, которое вы предоставили, может быть продлено. referer = quote_plus (url.encode ('utf8')). Это должно кодировать не-символы, а затем цитирование URL должно работать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню