如何在重写语句中使用nginx if's param $1

Ale*_*lov 4 nginx

我在 nginx 配置中有这个工作代码:

if ($http_host ~* ^www\.(.+)$) {
    set $host2 $1;
    rewrite  (.*)  http://$host2$1;
}
Run Code Online (Sandbox Code Playgroud)

我认为可以省略字符串set $host2 $1;并在重写语句中使用 $1 而不定义某些变量。但重写有自己的 $1..$9 参数。

我如何在重写语句中使用 $1 形式?

Kev*_*udé 5

我认为正则表达式美元形式仅适用于最新的正则表达式。所以你不能在不使用 的情况下将$1theif与 the$1结合起来。但是,对于您的情况,有更简单的解决方案。rewriteset

首先,如果您知道主机名(例如example.com),您可以执行以下操作:

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}
server { server_name example.com; ... }
Run Code Online (Sandbox Code Playgroud)

另一方面,如果您没有想到特定的主机名,则可以执行以下万能解决方案:

server {
    server_name ~^www\.(?<domain>.+)$;
    return 301 $scheme://$domain$request_uri;
}
server { server_name _; ... }
Run Code Online (Sandbox Code Playgroud)

您可以在此处了解有关第二种形式的更多信息。

我不推荐包罗万象的解决方案,因为最多只有一个包罗万象的服务器块才有意义。如果可能,请使用命名服务器解决方案。

另请注意,您可以使用表单实现上述重定向rewrite ^ destination permanent;。所有这些解决方案都避免使用不受重视的if指令。