如何编写一个NGINX重写,将/filters/之后的所有内容从URL中剥离出来

bxpogfeg  于 2022-12-11  发布在  Nginx
关注(0)|答案(1)|浏览(125)

我们正在运行Symfony应用程序,该应用程序的路由为:domain.tld/main-category/category/
出于SEO目的,他们希望在URL中包含如下过滤器:domain.tld/main-category/category/filters/price:0-100
所以基本上我们希望浏览器中的URL保持不变,但在Symfony中它应该去掉/filters/之后的所有内容,所以路由应该保持“domain.tld/main-category/category/"。
我尝试了这个确实工作,但我需要它的工作使用Symfony路线,但无法让它工作。

rewrite ^/.*/filters/.* /test.html last;

NGINX配置:

location ~ ^/index\.php(/|$) {
    include fastcgi_params;
    fastcgi_pass php_project:9000;
    fastcgi_read_timeout 600s;
    fastcgi_split_path_info ^(.+\.php)(/.*)$;

    fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
    fastcgi_param DOCUMENT_ROOT $realpath_root;
    internal;
}
owfi6suc

owfi6suc1#

  • 免责声明:这是一个猜测,可能不适用于您 *

PHP应用程序(如index.php)通常使用REQUEST_URI参数来确定“route”。这在fastcgi_params文件中定义为:

fastcgi_param REQUEST_URI $request_uri;

一种解决方案是使用map指令操作此值。
例如:

map $request_uri $myroute {
    default                      $request_uri;
    ~*^(?<newroute>/.*)/filters/  $newroute;
}
server {
    ...
    location ~ ^/index\.php(/|$) {
        include fastcgi_params;
        fastcgi_pass php_project:9000;
        fastcgi_read_timeout 600s;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
    
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param REQUEST_URI $myroute;
        internal;
    }
}

请注意,map必须放在server区块之外。
您不需要编辑fastcgi_params文件,只需确保fastcgi_param语句出现在位置块中**include语句之后**。

相关问题