我使用了 CNAME 通配符 DNS 条目,例如:
@ IN A ip.add.re.ss
www IN CNAME @
* IN CNAME @
我的根 domain.com 和 sub1.domain.com 可以访问(在同一个 digitalocean droplet 上)。
但是,如果我尝试访问 sub2.domain.com,在配置 Web 服务器后,它会带我到 sub1.domain.com。
我使用的是 NginX 服务器块,所有域都使用相同的 IP 地址。(我在 80 上配置了 domain.com,同时访问/配置了 sub1.domain.com:8088 和 sub2.domain.com:8088 等子域)
sub1 是 phpmyadmin:
server {
listen 8088;
server_name phpmyadmin.mydomain.com;
root /usr/share/nginx/html/phpmyadmin;
index index.php index.html index.htm;
access_log /var/log/nginx/phpmyadmin/access.log;
error_log /var/log/nginx/phpmyadmin/error.log;
if (!-e $request_filename) {
rewrite ^/(.+)$ /index.php?url=$1 last;
break;
}
# Images and static content is treated different
location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|xml)$ {
access_log off;
expires 360d;
}
location ~ /\.ht {
deny all;
}
location ~ /(libraries|setup/frames|setup/libs) {
deny all;
return 404;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
sub2 是统计数据:
server {
listen 8088;
server_name stats.mydomain.com;
root /usr/share/nginx/html/piwik;
index index.php piwik.php;
access_log /var/log/nginx/piwik/access.log;
error_log /var/log/nginx/piwik/error.log;
location ~ /\.ht {
deny all;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_index index.php;
include /etc/nginx/fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
我的/etc/hosts:
127.0.0.1 localhost mydomain
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
在浏览器中输入 phpmyadmin.mydomain.com:8088 没问题,但输入 stats.mydomain.com:8088 会转到 phpmyadmin 登录页面。我需要为多个子域创建更多 A 或 CNAME 记录吗?
答案1
如果你重新加载了配置(nginx -s reload
),但没有任何变化,那么我怀疑是有人default_server
耍了花招。让我们来看看文档。
nginx 仅测试请求的标头字段“Host”,以确定应将请求路由到哪个服务器。如果其值与任何服务器名称都不匹配,或者请求根本不包含此标头字段,则 nginx 会将请求路由到此端口的默认服务器。
基本上,这意味着如果没有server{}
为您的请求提供句柄,它将被转移到默认服务器。由于您没有明确设置一个...
在上面的配置中 [参见文档中的示例],默认服务器是第一个 - 这是 nginx 的标准默认行为。
在您的例子中,“第一个服务器”是 phpMyAdmin,因为字母表中的“p”位于“s”(统计)之前。发生的情况是:
- 您的请求已发送至
stats.mydomain.com
。 - 统计信息
server{}
块不提供与您的 URI 匹配的任何位置块。 - nginx 将请求转发到默认服务器,即 phpMyAdmin
从那里 :
- phpMyAdmin 可以处理该请求,或者......
- 但不能,导致 404 或 403 错误。
由于以下配置...
if (!-e $request_filename) {}
... phpMyAdminserver{}
能够处理任何请求,因为它将所有错误的请求重写为index.php
请求。当它无法处理参数时,您会被重定向到登录页面,因为这是默认的 phpMyAdmin 页面$_GET['url']
。
为了验证该理论,只需default_server
在统计配置中添加监听端口:
listen 8088 default_server;
如果行为发生变化,那么你就可以确定了。下一步就是调查日志。你的统计配置可能与实际目录结构不匹配,从而导致 404 或 403 错误(这首先导致请求被转发到默认服务器 phpMyAdmin)。