Nginx,重写获取查询

Nginx,重写获取查询

我想重写来自

/shop/?category=kitset-kitchens

shop/category/kitset-kitchens

我尝试过的:

rewrite ^/shop.*$ /shop/category/$arg_category permanent;
goes to:
shop/category/kitset-kitchens?category=kitset-kitchens

如果我像这样输入“?”:

rewrite ^/shop.*$ /shop/category/$arg_category? permanent;
goes to:
shop/category/

我尝试使用变量,但结果是一样的。一旦 $args 设置为 '',所有其他变量都为空,否则,它会在 URL 末尾添加获取查询。我做错了什么?

我不想使用条件

答案1

我不确定浏览器是否会在缓存重定向后考虑查询参数。这意味着浏览器在执行一次从到/shop/?category=kitset-kitchens的重定向后/shop/category/kitset-kitchens,即使category查询参数有其他值,它也会将您重定向到同一页面。不同的浏览器可能会有不同的行为,因此这个主题需要进行一些测试。

回到问题,为了清除category查询参数并保留所有其他可以使用的参数

    location = /shop/ {
        if ($args ~ (.*)(^|&)category=[^&]*(\2|$)&?(.*)) {
            # preserve 'category' parameter value
            set $category $arg_category;
            # remove 'category' parameter from query string
            set $args $1$3$4;
            # rewrite URI or do redirection
            rewrite ^ /shop/category/$category break;
        }
        # if you need to pass the request to an upstream, use
        proxy_pass http://upstream$uri$is_args$args;
    }

请注意,使用此配置,用户浏览器中的网址不会从 更改为example.com/shop/?category=kitset-kitchensexample.com/shop/category/kitset-kitchens我们在这里仅使用内部重写)。您可以尝试重定向(将指令break的标志更改为),但正如我已经说过的,由于可能存在缓存问题,此配置需要通过各种浏览器进行测试。您也可以尝试临时重定向(为此使用标志)。rewritepermanentredirect

您说过您不想使用条件,但由于块内除set和之外没有其他指令,因此可能被认为是安全的。rewriteif

相关内容