nginx 301 使用 query_string 变量重定向,如果

nginx 301 redirect with query_string variable and if

我是 nginx 的新手,我需要设置一个 301 重定向负载,每个都将旧文件指向新文件,如下所示:

# www.domain.com/products/category/product.php?id=103 
# to 
# www.domain.com/products/new-category-name/new-product-name.html 

为了处理 ? 我有以下似乎工作正常的方法:

if ($args ~ "id=103") {
    rewrite ^ /products/new-category-name/new-product-name.html? permanent;
}

这看起来怎么样?我知道 if 在 nginx 中主要是个坏主意,但我不完全明白为什么。上面的规则可以吗?它似乎工作正常。最后,我有大约 100 个 url 要重定向。是否可以为每个 url 复制此规则?

谢谢


更新
映射看起来是一个很好的解决方案,但我不确定将代码放在哪里。我目前有以下内容:

location / {
    try_files $uri $uri/ @modx-rewrite;
}

声明任何额外的规则都需要放在这个位置块之前。

我建议使用 ngx_http_map_module

为 urlmapping 创建一个文件,其中包含新旧 url,例如

/products/category/product.php?id=103    /products/new-category-name/new-product-name.html ;
/products/category2/product.php?id=104   /products/new-category2-name/new-product104-name.html ;

这很容易维护。只需为新映射添加一个新行并重新加载您的 nginx 配置。

在您的 nginx 配置中创建一个位置,其映射类似于

map $request_uri $newuri {
    include /path/to/your/mappingfile;
}
server {
    ...
    location / {
        if ($newuri) {
            return 301 $newuri;
        }
    }
}