Nginx 通配符子域重定向,同时保留查询字符串

Nginx 通配符子域重定向,同时保留查询字符串

我正在尝试将通配符子域重定向到新 URL,同时在 URL 末尾附加子域;例如sub1.example.com将重定向到www.newdomain.example/categories/sub1

server {
server_name ~^(.*)\.example\.com$ ;
return 301 $scheme://newdomain.example/categories/;
}

?我认为 Nginx 默认会添加这个,因为最后没有阻止它。

答案1

或者不使用邪恶,如果:

server {
  server_name ~^(.*)\.example\.com$;
  return 301 $scheme://www.newdomain.example/categories/$1$request_uri;
}

因为 $request_uri 已经包含查询字符串/参数,请参阅http://nginx.org/en/docs/http/ngx_http_core_module.html

当你不想使用 $request_uri 时,我还想提一下 $is_args $args 对

  location = /from {
    return 301 /to$is_args$args;
  }

答案2

请参阅server_name示例官方文档:

server {
  server_name ~^(.*)\.example\.com$;
  if ($query_string) {
    return 301 $scheme://newdomain.example/categories/$1?$query_string;
  }
  return 301 $scheme://newdomain.example/categories/$1;
}

sub1.example.com 将重定向到 www.newdomain.example/categories/sub1

www.newdomain.example或者example.com哪个是正确的?

答案3

要重定向http://cat.example.com/post/1?comments=truehttp://example.com/categories/cat/post/1?comments=true,您可以使用以下配置:

server {
    server_name ~^(.*)\.(example\.com)$;
    return 301 $scheme://$2/categories/$1$request_uri;
}

它使用带有捕获组的正则表达式server_name以避免重复。默认情况下,在您的示例中不保留查询字符串,而在建议的配置中,它是使用保留的$request_uri:

$request_uri
    full original request URI (with arguments) 

相关内容