最近在检查本站的收录情况时,发现百度收录了很多带问号参数的首页 url,类似下面这种:

https://www.codesou.cn/?action=novel&id=1234
https://www.codesou.cn/?action=news&id=4321

实际上这些链接无任何意义、都是首页。但是这样会造成权重分散,对 seo 有负面影响,因此决定进行 url 重写。

按照以往的经验,写出了下面的 rewrite 规则:

rewrite ^/?action=(w+)&id=(d+)$ https://www.codesou.cn permanent;

再次访问发现重写规则并未生效,查了一下 nginx 文档发现,在 nginx 中 url 中如果包含问号,那么从问号后开始自动一刀切识别成$query_string,不会对这部分再进行正则匹配了,因此导致上面的重写规则无效,那么我们判断一下$query_string就可以了。

location /
{
  if ( $query_string ~ "action=novel&id=(d+)$" ) {
    rewrite ^/ https://www.codesou.cn/? permanent; 
  }
}

再次访问重写规则正确运行,开头示例中的 url 会自动 301 跳转到首页。需要注意的是在网站后面多加了一个“?”号,要不然会导致 too many 重定向错误。