定义
任何由关键字server开始的部分都被称为“虚拟主机”部分。描述的是一组根据不同的server_name指令逻辑分割的资源,这些虚拟主机响应HTTP请求,都包含在http部分中。
一个虚拟主机由listen和server_name指令组合定义。
listen指令定义一个IP/端口组合或者是Unix域套接字路径:
listen address[:port]; listen port; listen unix:path;
server_name指令的默认值是“”,意味着server部分没有server_name指令,对于没有设置Host头字段的请求,将会匹配该server处理。可用于丢弃不含Host头的请求。
server { listen 80; return 444; # 444非标准代码将会使得Nginx立即关闭一个连接。 }
Nginx接受通配符和正则表达式作为server_name指令的参数:
通配符可以替代部分子域名:*.example.com 通配符可以替代部分顶级域:www.example.* 匹配子域或域本身:.example.com(匹配.example.com,也包括example.com) 在域名前加上波浪号(~)说明使用正则表达式: server_name ~^www\.example\.com$; server_name ~^www(d+)\.example\.(com)$;
特定请求匹配虚拟主机时遵循的逻辑
1、匹配IP地址和listen指令指定的端口;
2、将Host头字段作为一个字符串匹配server_name;
3、将Host头字段与server_name字符串的开始部分做匹配;
4、将Host头字段与server_name字符串的结尾部分做匹配;
5、将Host头字段与server_name进行正则表达式匹配;
6、如果所有Host头匹配失败,将会转向listen指令定义的default_server;
7、如果所有的Host头匹配失败,并且没有default_server,那么将会转向第一个server的listen指令。
Locations
location指令可以用在虚拟主机server部分,提供来自客户端的URI或者内部重定向访问。location可以被嵌套使用。
location定义如下:
location [=|^~|~|~*] /uri { …… } 或者命名location: location @name { …… }
location修饰符:
= | 使用精确匹配并且终止搜索 |
~ | 使用区分大小写的正则表达式匹配 |
~* | 使用不区分大小写的正则表达式匹配 |
^~ | 如果该location是最佳匹配,那么对于匹配这个location的字符串,不再进行正则表达式匹配。 这不是一个正则表达式,目的是优于正则表达式的匹配。 |
匹配规则:
1、没有正则表达式的location被优先匹配,独立于含有正则表达式的location顺序;
2、在配置文件中按照顺序进行正则表达式匹配。在查找到第一个正则表达式匹配之后结束查找。
try_files:
try_files指令将会按照给定它的参数顺序进行尝试,第一个匹配的将会使用。经常被用于从一个变量去匹配一个可能的文件,然后将剩余请求传递到一个命名location:
location / { try_files $uri $uri/ @app; } location @app { proxy_pass http://appserver; }
location的嵌套使用,不适用于使用“=”修饰符做前缀和命令location:
location / { # 首先,匹配根路径 location ^~ /css { # 然后,找到一个最佳匹配/css。注意,这里不是正则表达式 location ~* /css/.*\.css$ { # 最后,通过正则表达式找到了最佳匹配 …… } } }
一个虚拟服务器的完整示例配置
server { listen 80; return 444; } server { listen 80; server_name localhost.myserver.com; location / { try_files $uri $uri/ @Nginxserver; } location @Nginxserver { proxy_pass http://127.0.0.1:8080; } }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。