ngninx 动态(子)域的配置

ngninx 动态(子)域的配置

我正在尝试以一种方式配置 nginx,以便以后可以减少摆弄。

我不想为每个域和子域创建一个配置文件,我想要一个可以处理所有域和子域的配置文件(如果子域需要与主域分离,则需要两个)。

例如,假设这些域正在使用中:

  • 示例.com
    • /var/www/示例/公共
  • www.example.com
    • /var/www/示例/公共
  • 测试.example.com
    • /var/www/示例/子域名/测试/公共
  • abc.example.com
    • /var/www/示例/子域名/abc/public
  • myothersite.com
    • /var/www/myothersite/公共

当然,www 和非 www 不应该共存 - 所以一个应该重定向到另一个。假设在这种情况下我没有从一个重定向到另一个,它们都应该使用相同的目录。

上述要点说明了我想要实现的目录结构类型,但到目前为止我所有的尝试都失败了。

server {
    listen      80 default_server;
    server_name ~^(www\.)?(?<domain>.+)$;

    # Location of each domain
    location / {
        root   /var/www/$domain/public;
        index index.php index.html index.htm;
    }

    # ... some other config stuffs
}

然后,我尝试设置一个子域配置文件,但是这个文件似乎总是占据主导地位(这也意味着我必须将我的站点文件夹命名为“example.com”或“example.co.uk”)。

当我访问“test.example.com”之类的地址时,它会在错误日志中显示尝试访问/var/www/test.example.com/public

有什么想法吗?非常感谢!

我在 CentOS 6.4 和 nginx 1.0.15 上。

答案1

这是一个解决方案。虽然不太优雅,但确实有效。

server {
    listen 80;
    server_name ~^(?<domain>[^\.]+)\.(?<tld>[^\.]+)$;
    root /var/www/$domain/public;

    location / {
       index index.php index.html index.htm;
    }
}

server {
    listen 80;
    server_name ~^(?<subdomain>[^\.]*)\.?(?<domain>[^\.]+)\.(?<tld>[^\.]+)$;
    root /var/www/$domain/subdomains/$subdomain/public;

    location / {
        if ($subdomain = 'www') {
            root /var/www/$domain/public;
        }
        index index.php index.html index.htm;
    }
}

请注意,它只适用于二级和三级域名。例如,foo.com 和 test.foo.com,但不适用于 more.test.foo.com。

相关内容