У меня есть конфигурация Nginx, предназначенная для нового приложения PHP, которое имеет те же функции, что и другое устаревшее приложение PHP, но с другими URL-адресами.
Хочу сохранить пути старого приложения, заменив /foo
префикс пути с /page
и заменяя специальный путь /foo/bar
с участием /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;
...
}
Видеть этот документ для большего.