如何对特定的查询字符串模式进行nginx重写?

brgchamk  于 2023-02-21  发布在  Nginx
关注(0)|答案(1)|浏览(118)

我们正在获得大量的流量到我们的主要网站在以下模式。参数是不同的一切这是搞乱了我的缓存。我需要做重定向:
这些将重定向到/?lang=zh-hans

/?lang=zh-hans&category=26%2C27&full=1&mo=9&yr=2022&id=1800312749
/?lang=zh-hans&category=26%2C27&full=1&mo=8&yr=2022&id=111871000
/?lang=zh-hans&id=1930613962&category=26%2C27&full=1&mo=10&yr=2022
/?lang=zh-hans&category=26%2C27&full=1&mo=08&yr=2022&id=1205387849

这些将重定向到/?lang=zh-hant

/?lang=zh-hant&category=26%2C27&full=1&mo=9&yr=2022&id=1800312749
/?lang=zh-hant&category=26%2C27&full=1&mo=8&yr=2022&id=111871000
/?lang=zh-hant&id=1930613962&category=26%2C27&full=1&mo=10&yr=2022
/?lang=zh-hant&category=26%2C27&full=1&mo=08&yr=2022&id=1205387849

为了避免复杂性,我只需要在根路径上执行此操作。
这是我在nginx上尝试过的,但是不起作用。

rewrite ^/?lang=zh-hans&category=.+ /?lang=zh-hans permanent;
2ledvvac

2ledvvac1#

如果我没理解错的话,你需要把所有以/?lang=zh-hant…开头的请求重定向到/?lang=zh-hant,把所有以/?lang=zh-hans…开头的请求重定向到/?lang=zh-hans,忽略其他GET参数。

http {

  … skipped …
  
  map $request_uri $redirect {
    "~^\/\?lang=zh-hans&.*$"   /?lang=zh-hans; 
    "~^\/\?lang=zh-hant&.*$"   /?lang=zh-hant;
  }

  server { 

    if ($redirect) {
        return 301 $redirect;
    }

  … skipped …
  
  }
}

这里,在map部分,我们告诉nginx检查$request_uri是否以?lang=zh-hans&?lang=zh-hant&子字符串**开头,并将相应的值设置到$redirect变量中.然后在server部分,我们告诉nginx检查$redirect是否存在,如果存在,则返回301 redirect,并从该变量返回位置.
请注意,仅当lang参数是$request_uri中的第一个参数时,这才起作用,即对/?lang=zh-hant&category=26%2C27&full=1的请求将被重定向,但/?category=26%2C27&lang=zh-hant&full=1将在 * 不 * 重定向的情况下被处理

相关问题