【问题标题】:nginx: rewrite a LOT (2000+) of urls with parametersnginx:用参数重写很多(2000+)url
【发布时间】:2018-03-09 10:24:30
【问题描述】:

我必须迁移很多带参数的 URL,看起来像这样:

/somepath/somearticle.html?p1=v1&p2=v2 --> /some-other-path-a

还有没有参数的相同 URL:

/somepath/somearticle.html --> /some-other-path-b

棘手的部分是这两个目标 URL 在新系统中是完全不同的页面,而在旧系统中,参数只是指示默认打开哪个选项卡。

我尝试了不同的重写规则,但得出的结论是 nginx 重写不考虑参数。我找到了一种使用位置指令的方法,但是拥有 2000 多个位置指令感觉不对。

有人知道如何以优雅的方式完成这项工作吗?值得注意的是,除了那些 2000 多个重定向之外,我还有另外 200.000(!) 个重定向。它们已经起作用了,因为它们相当简单。所以我要强调的是,性能应该是关键!

【问题讨论】:

    标签: redirect nginx parameters url-rewriting


    【解决方案1】:

    您无法匹配 location 和 rewrite 表达式中的查询字符串(从 ? 开始的任何内容),因为它不是规范化 URI 的一部分。详情请见this document。

    整个 URI 在$request_uri 参数中可用。如果参数的发送顺序不一致,使用$request_uri 可能会出现问题。


    要处理多个 URI,请使用 map 指令,例如:

    map $request_uri $redirect {
        default 0;
        /somepath/somearticle.html?p1=v1&p2=v2  /some-other-path-a;
        /somepath/somearticle.html              /some-other-path-b;
    }
    
    server {
        ...
        if ($redirect) {
            return 301 $redirect;
        }
        ...
    }
    

    您还可以在map 中使用正则表达式,例如,如果 URI 还包含可选的不匹配参数。请参阅this document 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 2018-10-29
      • 1970-01-01
      • 2014-02-18
      • 1970-01-01
      • 2015-06-13
      • 2016-09-29
      • 2015-08-26
      • 1970-01-01
      相关资源
      最近更新 更多