Fwd: nginx-fastcgi-rewrite

Валентин Бартенев vbart at nginx.com
Fri Nov 16 13:30:13 UTC 2012


On Friday 16 November 2012 16:39:23 Юрий Гончаров wrote:
> А магия таки есть
> 
> 
>         location ~ ^(/[^/]+) {
>                 try_files $uri $1/accesspoint.php /public/accesspoint.php
> =405;
>                 include fastcgi_params_ru;
>                 set $myuri $uri;
>                 fastcgi_param REQUEST_URI $myuri;
>                 fastcgi_connect_timeout 3600;
>                 fastcgi_send_timeout 3600;
>                 fastcgi_read_timeout 3600;
>                 fastcgi_pass unix:/tmp/php.socket;
>                 client_max_body_size 100m;
>                 root /www/
>         }
> 
> При такой конфигурации set отрабатывает до try_files и сохраняется
> промежуточное значение как надо.
> Если этот же location переписать так что делать не set а
> сразу fastcgi_param REQUEST_URI $uri - тогда будет /public/accesspoint.php
> Получается param сетится уже после try_files а set в location ДО...Магия?
> :)

Директива set относится к модулю rewrite: 
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
который сам по себе является одним большим "хаком", ибо его правила выполняются 
императивно, в то время, как nginx пытается следовать декларативному стилю.

Порядок директив модуля rewrite имеет значение только между собой в рамках 
одного блока location или server. Вы можете для пущей головоломки будущему 
админу перенести set вообще в самый конец.

А чтобы не ломать себе голову, лучше по возможности избегать программирования
в конфигурации. К сожалению, эта дурная привычка есть у всех пользователей php 
перешедших с apache.

Я и написал в конце: "ещё есть сотня вариантов это получить, той или иной 
степени корявости". Вы один из таких вариантов наглядно привели.

--
Валентин Бартенев
http://nginx.com/support.html
http://nginx.org/en/donation.html


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