因为本地存在多个不同域名的项目,为了与线上情况基本一致,所以需要让这些项目共享80端口,仅以不同域名来区分访问的代码路径。
nginx.conf命令配置一个静态文件服务器的最基本写法如下:
server {
listen 80; # 监听端口
server_name site.com; # 域名
root /website/site/public; # 服务器代码根目录
}
上述配置表示了80端口只对应一个域名 site.com,并且代码目录在 /website/site/public 。如果要其他域名也使用80端口,那么增加一个server段就可以了。
server {
listen 80;
server_name site.com;
root /website/site/public;
}
server {
listen 80;
server_name site2.com;
root /website/site2/public;
}
nginx某个版本(我本地环境用的是1.6.2支持)开始支持server_name正则匹配,所以像上面这样的配置还可以简写成这样:
server {
listen 80;
server_name (?<domain>.+).com;
root /website/$domain/public;
}
上面的写法要求域名和目录存在相同的直接对应关系,有时候对应的目录可能是不同的结构。比如说以下这种对应关系:
<font size=2> dev.site1.com 对应 /website/site1/public
dev.site2.com 对应 /website/site2/public
pre.site1.com 对应 /website/preview/site1/public
pre.site2.com 对应 /website/preview/site2/public </font>
那么使用正则的写法如下:
server {
listen 80;
server_name dev.(?<devdomain>.+).com pre.(?<predomain>.+).com;
# 判断是否取到了正则中的变量,然后进行对应目录映射
if ( $devdomain ){
set $dir $devdomain ;
}
if ( $predomain ){
set $dir preview/$predomain ;
}
root /website/$dir/public;
}
因为root命令不能被嵌套进if判断中,所以需要用一个变量来存储判断的结果。总之目的达成了。
相关文档
随便看看
畅言模块加载中