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