Nginx上的通配符虚拟主机


25

我刚刚在服务器上安装了Nginx,对结果非常满意,但是我仍然不知道如何插入通配符虚拟主机。

这是我想要的[directory]结构:

-- public_html (example.com)
---subdoamin 1 (x.example.com)
---subdomain 2 (y.example.com)

如您所见,它非常基本,我希望能够通过简单地为新的子域添加A记录来添加域,该记录将立即指向public_html下具有相同名称的子目录。

网络上有很多东西,但是我还没有碰到像这样的东西。

任何帮助将不胜感激。


我不知道你所说的“同名的子目录”当你的例子有两个不同的名称:subdomain 1/ x.example.com-你能澄清?
nickgrim 2011年

是的,不是很清楚抱歉。可以说我有子域x.example.com,它的目录是/的public_html / X,但是我同时需要example.com和www.example.com以点/的public_html /
rorygilchrist

Answers:


39

我告诉你。

配置文件

server {
  server_name example.com www.example.com;
  root www/pub;
}

server {
  server_name ~^(.*)\.example\.com$ ;
  root www/pub/$1;
}

测试文件

我们有两个测试文件:

$ cat www/pub/index.html 
COMMON

$ cat www/pub/t/index.html 
T

测试中

静态服务器名称:

$ curl -i -H 'Host: example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:42 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Wed, 23 Mar 2011 07:56:24 GMT
Connection: keep-alive
Accept-Ranges: bytes

COMMON

$ curl -i -H 'Host: www.example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:48 GMT
Content-Type: text/html
Content-Length: 7
Last-Modified: Wed, 23 Mar 2011 07:56:24 GMT
Connection: keep-alive
Accept-Ranges: bytes

COMMON

和regexp服务器名称:

$ curl -i -H 'Host: t.example.com' http://localhost/
HTTP/1.1 200 OK
Server: nginx/0.8.54
Date: Wed, 23 Mar 2011 08:00:54 GMT
Content-Type: text/html
Content-Length: 2
Last-Modified: Wed, 23 Mar 2011 07:56:40 GMT
Connection: keep-alive
Accept-Ranges: bytes

T

不幸的是没有工作。所有子域都指向public_html。这是第二个服务器配置:server{ listen 80; server_name ~^(.*)\.example\.com$ ; location / { root /var/www/public_html/$1; index index.html index.htm index.php; } location ~ \.php$ { root $1; fastcgi_pass 127.0.0.1:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /var/www/public_html/$1$fastcgi_script_name; include fastcgi_params; } }
rorygilchrist 2011年

4
不幸的是,“不能正常工作”没有提供任何细节。请始终查看nginx error.log以获取详细信息。我已经更新了答案,向您展示了此配置的工作方式。您可以看到我的Nginx版本是0.8.54
Alexander

刚刚对我来说非常完美。
克莱尔·弗尼

5

下面的Nginx配置文件允许通配符主机名动态路由到相应的文件夹,/var/www/vhost/同时还动态生成相应的日志文件。

http://test1.wildcard.com/var/www/vhost/test1
                                                   /var/log/nginx/test1.wildcard.com-access.log                                                    /var/log/nginx/test1.wildcard.com-error.log

http://test2.wildcard.com/var/www/vhost/test2
                                                   /var/log/nginx/test2.wildcard.com-access.log                                                    /var/log/nginx/test2.wildcard.com-error.log

wildcard.conf

server {
  listen 80;
  listen [::]:80;

  #  Match everything except dot and store in $subdomain variable
  #  Matches test1.wildcard.com, test1-demo.wildcard.com
  #  Ignores sub2.test1.wildcard.com
  server_name ~^(?<subdomain>[^.]+).wildcard.com;

  root /var/www/vhost/$subdomain;

  access_log /var/log/nginx/$host-access.log;
  error_log  /var/log/nginx/$host-error.log;
}

请说明您的解决方案。
安德鲁·舒尔曼

这似乎与现有答案几乎相同。这增加了什么?
迈克尔·汉普顿

1
提供更多的特异性。希望对大家有帮助。
AnthumChris

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.