我正在尝试以一种方式配置 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。