Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

nginx 配置之 server_name

  很多时候一台机器上会搭建多个站点,也就是一个 80 端口对应多个站点,它们根据 HTTP 请求头中的 Host 来区分。在 nginx 的 server 指令中可以使用 server_name 指令来匹配请求头中的 Host 以方便地建立站点。server_name 支持通配符和正则,所以可以玩出很多花样。
  通常,我们会在 nginx.conf 中使用 include 指令去引用一个目录下的所有 *.conf 文件,在这些文件中配置每个站点。当站点越来越多时,我们甚至都忘记了哪些域名被使用过,导致 nginx 启动时检测出 server_name 冲突而抛出警告,比如这样: server { listen 80; server_name xxx; return 200 1; } server { listen 80; server_name xxx; return 200 2; } nginx: [warn] conflicting server name "xxx" on 0.0.0.0:80, ignored   注意这只是个警告而已,并不是错误。也就是说先设置的那个 server 生效了,而之后的失效(也就是上面这个配置如果发起请求的话应该是响应 1 而不是 2)。由于这些问题总是会带来意料之外的结果,所以建议的做法是让 *.conf 以 server_name 来命名,因为文件名是不会冲突的,这样就可以避免 server_name 冲突。
  server_name 不仅可以直接写域名,还可以使用通配符,比如下面这样可以匹配所有 *.xxx 的域名。
server { listen 80; server_name *.xxx; return 200 200; }   甚至还可以以「~」开头表示使用正则(注意「~」后面不能有空格,因为 server_name 支持同时设置多个值并以空格隔开)。
server { listen 80; server_name ~\.xxx$; return 200 '~\.xxx$dollar'; }   既然有这么多支持,那就自然有匹配的包含问题。比如一个域名既能完全匹配一个字符串,又能匹配通通配符,还能匹配正则,它的优先级要如何计算呢?这就比较简单了,也许大家都可以猜到。字符串匹配的优先级最高,其次是通配符,最后是正则。
  当两个正则匹配同时满足时,先定义的 server 会被优先使用(写两个完全相同的通配符匹配会抛出警告)。
  最后一种是当访问一个端口却没有任何 server_name 可以匹配的情况。这时候 nginx 会默认使用第一个 listen 这个端口的 server。当然这个默认值也是可以改的,只要在 listen 指令中加入 default 即可。比如下面这个 server 就会将所有匹配不到的站点全部匹配过来。
server { listen 80 default; return 404 'no site found'; }
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^