Nginx 301 通过变量重定向

Nginx 301 Redirect by variable

我正在为我托管的网站设置 301 重定向服务器。当我有一个新客户时,我不想去编辑下面服务器块中的域列表。我想将 anydomain-here.com 重定向到 301 -> www.anydomain-here.com

而不是 nginx 配置中的硬编码域

所有裸域(即 domain.com)都将重定向到 www。domain.com

server {
  server_name domain-requested.com;
  rewrite ^/(.*)$ http://www.domain-requested.com/ permanent;
}

在上面的示例中,是否可以将域请求更改为变量?这将允许服务器重定向任何没有子域的站点,例如 www.

您可以使用 Nginx 1.4.6 摆脱至少一个硬编码域名:

 rewrite ^/(.*)$ http://www.$server_name/ permanent;

您可以通过将其放入所有服务器块都包含的包含文件来进一步抽象它。你不能比单独使用 Nginx 做得更好,因为 rewrite 不允许在 http 上下文中声明以应用于多个 server 块。

需要考虑的其他一些想法:

  • 使用模板系统来管理您的 Nginx 配置。
  • 许多 DNS 提供 HTTP 重定向服务,因此他们的网络服务器将是接收请求和接收重定向的服务器。

以上两种方法我都用过。使用 DNS 提供商进行 HTTP 重定向的缺点是它们不处理传入的 SSL 请求,但如果您打算购买并安装第二个 SSL 证书只是为了自己处理第二个域上的 HTTPS 重定向,那么这只是一个缺点。

如果使用裸域,您可以使用映射来设置变量:

map $host $anydomain_here {
    # capture bare domain & store in variable $anydomain_here
    ~^(?<anydomain>[^\.]+)\.com$ $anydomain;
}

server {
    listen  80  default_server;
    server_name _;

    if ($anydomain_here) {
        # redirect if a bare domain was matched
        return 301 $scheme://www.$anydomain_here.com$uri;
    }
}