Приветствую, друзья.
Подскажите, как подружить rewrite и fastcgi? На сервере работает связка nginx и php-fpm.
Конфигурация следующая:
mainserver
{
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.confinclude 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.conflocation ~ ^.+\.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.confinclude 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.