У меня есть конфигурация Nginx для нового PHP-приложения, которое имеет те же функции, что и другое устаревшее PHP-приложение, но с другими URL-адресами.
Я хочу сохранить пути старого приложения, заменив префикс пути / foo
на / page
и заменив специальный путь / foo / bar
with / page / otherBar
:
# legacy support
location ~ ^/foo/bar {
rewrite /foo/bar /page/otherBar$1 last;
}
# How to rewrite all other pages starting with "/foo" ?
# END legacy support
location / {
# try to serve file directly, fallback to front controller
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
proxy_read_timeout 300;
include fastcgi_params;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
fastcgi_param SCRIPT_FILENAME /usr/share/nginx/www/$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
Этот подход не работает, потому что $ request_uri
, который передается на REQUEST_URI
в fastcgi_params
] включить файл, все еще содержит / foo / bar
.
Я попытался установить REQUEST_URI
на $ fastcgi_path_info
, но это не удалось для всех неперезаписанных URL-адресов, поскольку тогда он был пуст. $ uri
также не работает, потому что он просто содержит /index.php?
Есть ли какая-либо переменная для конфигурации третьего местоположения, которая содержит перезаписанный путь?
$request_uri
имеет значение исходного URI и $uri
имеет значение конечного URI. С помощью директивы set
можно сохранить снимок $uri
изнутри блока location /
и использовать его позже для генерации параметра REQUEST_URI
.
Вот так:
location / {
set $save_uri $uri;
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
include fastcgi_params;
fastcgi_param REQUEST_URI $save_uri;
...
}
Смотрите данный документ подробнее.
.