Nginx 虚拟主机中配置 server_name ⼀个server块中配置多个站点 ⼀个站点配置多个⼆级域名
⼀个server块中配置多个站点
server { listen 80; server_name ~^(www.)?(.+)$; index index.php index.html; root /html/$2; }
站点的主⽬录结构:
/html/domain.com
/html/nginx.org
⼀个server块中为⼀个站点配置多个⼆级域名
server { listen 80; server_name ~^(.+)?.domain.com$; index index.html; if ($host = domain.com) { rewrite ^ http://www.domain.com permanent; } root /html/domain.com/$1/ }
站点的⽬录结构应该如下:
/html/domain.com/www/ /html/domain.com/nginx/
PS:访问www.domain.com时,root⽬录为 /html/domain.com/www/
访问nginx.domain.com时,root⽬录为 /html/domain.com/nginx/
if语句的作⽤是将 domain.com 重定向到 www.domain.com,可以增加seo中对 www.domain.com 的域名权重。
指令详解
server_name 指令设置基于域名的虚拟主机,⼀个ip的服务器可以配置多个域名。下⾯这些server_name是有效的:
server_name domain.com;
server_name domain.com www. domain.com;
server_name *.domain.com;
server_name .domain.com;
server_name domain.*;
server_name "";
多个域名之间以空格分隔。nginx允许⼀个虚拟主机有⼀个或多个名字,也可以使⽤通配符"*"来设置虚拟主机的名字。
server_name指令在接到请求后的匹配顺序分别为:
1、准确的server_name匹配,例如:domain.com www.domain.com
2、以通配符开始的字符串: .domain.com .domain.com
3、以通配符结束的字符串:www.
4、匹配正则表达式:~^(?.+).domain.com$
nginx将按照1,2,3,4的顺序对server name进⾏匹配,有⼀项匹配以后就会停⽌搜索,类似于location指令。
其他
有多个域名时(server_name other.domain.com www. domain.com;):fastcgi_param SERVER_NAME $server_name ,$server_name 会取值第一个域名(other.domain.com)。
$host 有可能等于 $server_name ,也可能是IP地址(直接通过访问此优先顺序取值:请求行中的主机名,或“主机”请求标头字段中的主机名,或与请求匹配的服务器名。
$1|$2|$3 ...
是nginx在匹配正则时生成的变量,用于捕获一个正则表达式括号中匹配的字符串(从左到右依次存储在$1|$2|$3 ...
中),新值覆盖旧值,可以使用变量保存需要用到的值:set $pre $1