nginx 位置主机不带 www

nginx 位置主机不带 www

我必须将 www.example.com/docs/....pdf 重定向到现有项目上的 trader.example.com/docs/....pdf。这同样适用于 *.biz。我不知道如何从 $host-Variable 中提取 wwww-Part。

server {
        listen 80;
        server_name www.example.com www.example.biz;

        location /docs {
                        root /data/http/example/docs;
                        rewrite ^ $scheme://trader.$host$request_uri;
        }
}

有人知道我该如何解决这个问题吗?

答案1

欢迎来到 ServerFault。

您可以使用地图指令来提取部分值$host,如下所示......

map $host $tld {
    default $host;
    '~^www\.(?<domain>.*)$' $domain;
}

server {
    listen 80;
    server_name www.example.com www.example.biz;

    location /docs {
        root /data/http/example/docs;
        return $scheme://trader.$tld$request_uri;
    }
}

map指令有助于提取$tld不包含www.URL 部分的值。作为题外话,没有必要使用rewrite语句。由于上面的代码中没有对正则表达式的求值,因此return最好使用语句来更快地执行。

答案2

您可以www从域中删除所有内容。此配置应该有帮助。

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

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

server {
        listen 80;
        server_name example.com example.biz;

        location /docs {
                        root /data/http/example/docs;
                        rewrite ^ $scheme://trader.$host$request_uri;
        }
}

更新:如果您希望从多个主机名中删除 www,则可以将其添加到可以捕获主机名的服务器块中(注意:如果可能,以上方法更好)。

if ($host ~* www\.(.*)) {
  set $host_without_www $1;
  rewrite ^(.*)$ $scheme://$host_without_www$1 permanent; #1
  #rewrite ^ $scheme://$host_without_www$1request_uri permanent; #2
}

答案3

这是我使用的方法,效果很好:

server
{
    if ($host ~* ^www\.(.*)) {
        set $host_without_www $1;

        rewrite ^(.*) https://$host_without_www$1 permanent;
    }
}

相关内容