Nginx 301按变量重定向

Nginx 301按变量重定向,nginx,http-redirect,Nginx,Http Redirect,我正在为我托管的网站设置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.c

我正在为我托管的网站设置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/$1 permanent;
}

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

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

 rewrite ^/(.*)$ http://www.$server_name/$1 permanent;
您可以将其进一步抽象为一个包含文件,所有服务器块都包含该文件。单独使用Nginx做得再好不过了,因为
rewrite
不允许在
http
上下文中声明以应用于多个
服务器

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

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

这两种方法我都用过。使用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;
    }
}
在此映射$host$anydomain\u{
#捕获裸域并存储在变量$anydomain\中
~^(?[^\.]+)\.com$$anydomain;
}
服务器{
监听80个默认_服务器;
服务器名称;
如果($anydomain\u此处){
#如果匹配裸域,则重定向
返回301$scheme://www.$anydomain_here.com$uri;
}
}

效果非常好-我甚至没有想过用那种方式!谢谢你的帮助,给了我学习的东西!我很高兴你发现它很有用!Nginx很有趣。做事情有很多不同的方法。