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