我想重写来自
/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-kitchens
(example.com/shop/category/kitset-kitchens
我们在这里仅使用内部重写)。您可以尝试重定向(将指令break
的标志更改为),但正如我已经说过的,由于可能存在缓存问题,此配置需要通过各种浏览器进行测试。您也可以尝试临时重定向(为此使用标志)。rewrite
permanent
redirect
您说过您不想使用条件,但由于块内除set
和之外没有其他指令,因此可能被认为是安全的。rewrite
if