Nginx - 使用重写的 URL 填充 REQUEST_URI

Nginx - 使用重写的 URL 填充 REQUEST_URI

我有一个新的 PHP 应用程序的 Nginx 配置,该应用程序具有与另一个旧式 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_URIfastcgi_params/foo/bar

我尝试过设置REQUEST_URI$fastcgi_path_info,但对于所有未重写的 URL 都失败了,因为它是空的。$uri也不起作用,因为它只包含/index.php?

第三个位置配置是否有包含重写路径的变量?

答案1

$request_uri具有原始 URI 的值,并$uri具有最终 URI 的值。您可以使用该指令保存块内部的set快照,并在稍后使用它来生成参数。$urilocation /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;
    ...
}

这个文件了解更多信息。

相关内容