【问题标题】:nginx 301 redirect with query_string variable and ifnginx 301 使用 query_string 变量重定向,如果
【发布时间】:2015-02-05 20:44:36
【问题描述】:

我是 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;
}

声明需要在此位置块之前放置任何其他规则。

【问题讨论】:

    标签: redirect nginx


    【解决方案1】:

    我建议使用 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;
            }
        }
    }
    

    【讨论】:

    • 这是个好主意,但 map 指令需要在服务器块之外。
    • 这看起来不错,但我不知道该放在哪里。我已经用更多信息更新了我的问题,谢谢
    • 非常感谢@hzei,不幸的是我无法访问服务器块之外,因此我无法使用此解决方案。我已将其设置为可接受的答案,因为它看起来很完美。我愿意接受其他建议。
    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-23
    • 1970-01-01
    • 1970-01-01
    • 2020-10-29
    • 1970-01-01
    相关资源
    最近更新 更多