Re: Отсутствие urlencode в результирующем url при rewrite
Maxim Dounin
mdounin на mdounin.ru
Вт Дек 29 16:47:43 MSK 2009
Hello!
On Tue, Dec 29, 2009 at 02:28:55PM +0200, Alexander Radostin wrote:
> Все привет!
>
> Мы недавно перешли с лайти на nginx и вылезла интересная проблема с
> различным поведением при rewrite.
>
> Вот такое правило:
>
> rewrite ^/download/([^/]+)/(.+)/$
> /index.php/download/?hash=$1&filename=$2 last;
>
> работает как надо, но к аргументам $1 и $2 не применяется urlencode, что
> приводит к проблемам в случае если в $2, например, есть апостроф "&". В
> итоге query_string получается битая (имя файла обрывается и появляется еще
> одна переменная). Как можно обойти эту проблему и есть ли способ делать
> url_encode для аргументов в результирующем url?
При составлении query string nginx экранирует только символы, не
допустимые в query string. Т.е. скажем пробел будет экранирован,
а амперсенд (апостроф - это совсем другой символ) - нет.
Следить за структурой аргументов - это совсем отдельная задача. И
она не может решаться автоматически, т.к. нужна возможность
вставлять из одной переменной несколько аргументов.
Варианты решения:
1. написать N rewrite'ов, делающих то экранирование которое вам
нужно
2. написать нужное экранирование на встроенном перле
3. приложить патчи catap'а для получения переменных $urlencode_*
Совсем правильно было бы конечно отказаться от использования
rewrite'ов, да и вообще php для скачивания файлов, но это совсем
отдельный и вероятно неинтересный разговор.
Maxim Dounin
Подробная информация о списке рассылки nginx-ru