3

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

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

我认为该字符串set $host2 $1;可能会被省略,并且 $1 在 rewrite 语句中使用而不定义一些变量。但是 rewrite 有自己的 $1..$9 参数。

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

4

1 回答 1

3

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

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

server {
    server_name www.example.com;
    return 301 $scheme://example.com$request_uri;
}
server { server_name example.com; ... }

另一方面,如果您没有记住特定的主机名,则可以执行以下包罗万象的解决方案:

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

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

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

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

于 2013-10-01T10:48:42.203 回答