Re: Проблема с двойным кодированием заголовка при проксировании

Alexander Gerasiov gq на cs.msu.su
Чт Сен 1 10:09:44 UTC 2016


Hello Maxim,

On Wed, 31 Aug 2016 20:58:47 +0300
Maxim Dounin <mdounin на mdounin.ru> wrote:
> > Использую nginx в качестве forward proxy к apache с mod_svn.
> > 
> > Известный трюк: для работы методов COPY MV требуется переписывать
> > заголок Destination, чтобы поменять схему с https на http

> > Это работает, но есть нюанс: если перемещаемый файл содержит
> > кириллицу в имени, то он оказывается дважды перекодирован:
> > 

> > В результате имя файла при копировании/перемещении бьется.
> > 
> > Вопрос: что с этим делать? Как сказать nginx, чтобы он не кодировал
> > заголовок при помощи urlencode? Или может как декодировать строку
> > перед передачей ее в proxy_set_header?  
> 
> Проблема в том, что "set" при использовании переменных $1 .. $9 
> делает ровно то же, что и rewrite, а именно - экранирует 
> специальные символы, предполагая, что исходной строкой был URI 
> запроса без экранировки.  При этом nginx знает, были ли в URI 
> запроса специальные символы, и если их не было - то экранирование 
> не делается.
> 
> Это, очевидно, баг, и когда нибудь его исправят, но пока этого не 
> случилось (в первую очередь потому, что там очень легко что-нибудь 
> сломать неосторожным движением).
Этот баг где-то зарепортили? Или мне стоит добавить в trac?

> 
> Простейшее решение на текущий момент - вместо $1 использовать 
> именованные выделения, т.е. так:
> 
>         if ($http_destination ~* ^https(?<foo>.*)$)
>         {
>                 set $fixed_destination http$foo;
>         }
> 
> Тогда экранирование делаться не будет в любом случае, и всё будет 
> работать как ожидается.
> 
Спасибо, это действительно сработало.


-- 
Best regards,
 Alexander Gerasiov

 Contacts:
 e-mail: gq на cs.msu.su  Homepage: http://gerasiov.net  Skype: gerasiov
 PGP fingerprint: 04B5 9D90 DF7C C2AB CD49  BAEA CA87 E9E8 2AAC 33F1



Подробная информация о списке рассылки nginx-ru