Cyapa
@Cyapa

Nginx: Как подружить rewrite и fastcgi?

Приветствую, друзья.

Подскажите, как подружить rewrite и fastcgi? На сервере работает связка nginx и php-fpm.
Конфигурация следующая:
main
server
{
        listen           80 default_server;
        server_name      example.com;


        root             /home/sites/example.com/;


        access_log       /var/log/nginx/example.com.bots.log advanced flush=1m buffer=32k if=$isBot;
        access_log       /var/log/nginx/example.com.access.log advanced flush=5m buffer=32k if=$isHuman;
        error_log        /var/log/nginx/example.com.errors.log warn;


        location @php
        {
                include      bootstrap/modules/php.conf;
        }

        location /
        {
                try_files    $uri $uri/ /index.php?$query_string;
        }

        location /application
        {
                deny         all;
        }

        location /errors/
        {
                alias        /home/sites/example.com/application/views/errors/;
                allow        all;
        }


        error_page       403 /errors/403.html;
        error_page       404 /errors/404.html;
        error_page       500 /errors/500.html;


        include          bootstrap/modules/gzip.conf;
        include          bootstrap/locations/system.conf;
        include          bootstrap/locations/static.conf;
        include          bootstrap/locations/errors.conf;
        include          bootstrap/locations/php.conf;
}

bootstrap/modules/php.conf
include                    fastcgi_params;

fastcgi_pass               php;
fastcgi_index              index.php;
fastcgi_next_upstream      error timeout;
fastcgi_keep_conn          on;
fastcgi_split_path_info    ^(.+?\.php)(/.*)$;


set $final_path_info       $fastcgi_path_info;
set $final_script_name     $fastcgi_script_name;

try_files                  $fastcgi_script_name = 404;

#fastcgi_param              PATH_INFO          $final_path_info;
fastcgi_param              SCRIPT_FILENAME    $document_root$final_script_name;
fastcgi_param              SCRIPT_NAME        $final_script_name;
fastcgi_param              REQUEST_URI        $request_uri;

bootstrap/locations/php.conf
location ~ ^.+\.php
{
        try_files    false  @php;
}

Задача состоит в том, чтобы переадресовать запросы к /stubs/api.php на /api/old.
Добавляю rewrite правило в секцию server (сразу после error_log):
rewrite ^/stubs/api\.php(.*)$ /api/old$1 last;

Но в $fastcgi_path_info и $fastcgi_script_name все равно попадают старые данные. Добавляю костыль:
bootstrap/modules/php.conf
include                    fastcgi_params;

fastcgi_pass               php;
fastcgi_index              index.php;
fastcgi_next_upstream      error timeout;
fastcgi_keep_conn          on;

set $final_path_info       "";
set $final_script_name     $uri;

if ($uri ~ "^(.+?\.php)(/.*)$")
{
        set $final_path_info       $2;
        set $final_script_name     $1;
}

try_files                  $fastcgi_script_name = 404;

#fastcgi_param              PATH_INFO          $final_path_info;
fastcgi_param              SCRIPT_FILENAME    $document_root$final_script_name;
fastcgi_param              SCRIPT_NAME        $final_script_name;
fastcgi_param              REQUEST_URI        $request_uri;

Начинает работать, но в REQUEST_URI попадает /stubs/api.php, а нужно чтобы там оказалось /api/old. Если использовать $uri вместо $request_uri, то там оказывается index.php.

Можно ли как-то достигнуть желаемого не внося в bootstrap/modules/php.conf специфичных для этого случая изменений (имеется ввиду, определять REQUEST_URI динамически, а не вставлять туда захардкоженную константу).

На данный момент просто делаю дополнительный рерайт REQUEST_URI на стороне php. Но хотелось бы изящнее решить проблему.

Так же хотелось бы выяснить, почему rewrite не влияет на $fastcgi_path_info и $fastcgi_script_name.
  • Вопрос задан
  • 653 просмотра
Пригласить эксперта
Ответы на вопрос 1
VELIK505
@VELIK505
Руководитель департамента profitcentr.com
if ($request_uri ~ ^/stubs/api.php) {  
    rewrite ^.*$ /api/old permanent;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы