Назад | Перейти на главную страницу

Nginx - заполнить REQUEST_URI переписанным URL

У меня есть конфигурация 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;
    ...
}

Видеть этот документ для большего.