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

Alexander Gerasiov gq на cs.msu.su
Ср Авг 31 15:54:08 UTC 2016


Добрый день.

Использую nginx в качестве forward proxy к apache с mod_svn.

Известный трюк: для работы методов COPY MV требуется переписывать
заголок Destination, чтобы поменять схему с https на http

        set $fixed_destination $http_destination;
        if ($http_destination ~* ^https(.*)$)
        {
                set $fixed_destination http$1;
        }
        location / {
                proxy_pass              http://svn:80/;
                proxy_set_header        Destination        $fixed_destination;
		proxy_set_header        Host     $host;

        }


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

Приходит в nginx он в виде:

Destination: https://host/test/!svn/txr/1-1/dir2/%D1%80%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9

Дальше выделяется при помощи регулярного выражения, конструируется
новый заголовок, оперируя всё еще закодированной строкой.

И дальше nginx _еще_раз_ кодирует этот заголовок при отправке, так
что в apache уже приходит

Destination: http://host/test/!svn/txr/1-1/dir2/%25D1%2580%25D1%2583%25D1%2581%25D1%2581%25D0%25BA%25D0%25B8%25D0%25B9


В результате имя файла при копировании/перемещении бьется.

Вопрос: что с этим делать? Как сказать nginx, чтобы он не кодировал заголовок
при помощи urlencode? Или может как декодировать строку перед передачей
ее в proxy_set_header?

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