前言 最近工作用到了nginx,但是路由配置特殊,业务场景复杂,因此整理了集中nginx跳转的配置方式,如servername的正则,location的匹配顺序,rewrite和proxy的示例,相信总有一种满足你的需求。 一、配置server对应的域名 server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。server_name匹配规则:后面可以跟多个域名,第1个是主域名 1.1、精确匹配 如下nginx配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
server { listen 8080; server_name test1.com; location / { return 200 "I am test1!\n"; } } server { listen 8080; server_name my.test.com; location / { return 200 "I am mytest!\n"; } } |
请求结果 curl http://my.test.com:8080 返回:I am mytest! curl http://test1.com:8080 返回:I am test1! 1.2、正则表达式 以*通配符开始的最长字符串,如下示例
1 2 3 4 5 6 7 |
server { listen 8080; server_name test1.*; location / { return 200 "I am test1!\n"; } } |
以*通配符结束的最长字符串
1 2 3 4 5 6 |
listen 8080; server_name *.test.com; location / { return 200 "I am mytest!\n"; } } |
通配符名字只可以在名字的起始处或结尾处包含一个星号,并且星号与其他字符之间用点分隔。所以,“my..com“都是非法的。 例如 :server_name my..com; 报以下错误: nginx: [emerg] invalid server name or wildcard "my.*.com" on 0.0.0.0:8080 匹配正则表达式
1 2 3 4 5 6 7 |
server { listen 8080; server_name ~^my(?<serno>.+).mydomain.com$; location / { return 200 $serno; } } |
解释说明 ~: 表示大小写敏感的正则; ^:匹配字符串的开始; {.+}:换行符以外的任意自读重复一次活更多次; (): 分组与取值; :表示转义; serno:设置提取的变量; $:匹配字符串的结束; 请求结果
1 2 |
curl http://my02.mydomain.com:8080 返回:02% curl http://my03.mydomain.com:8080 返回:03% |
server_name的配置顺序是怎样的呢? 按照如下顺序匹配: 匹配顺序-> ->精确匹配 ->*在前的域名 ->*在后的域名 ->按文件中的顺序匹配 ->default server:第一个,listen指定default 二、配置location 2.1、Location 匹配规则:仅匹配URI,忽略参数
1 |
location [=|~|~*|^~] /uri/ { … } |
匹配的正则符号如下: = 严格匹配。如果请求匹配这个location,那么将停止搜索并立即处理此请求 ~ 区分大小写匹配(可用正则表达式) ~* 不区分大小写匹配(可用正则表达式) !~ 区分大小写不匹配 !~* 不区分大小写不匹配 ^~ 如果把这个前缀用于一个常规字符串,那么告诉nginx 如果路径匹配那么不测试正则表达式 2.2、举例
1 2 3 4 5 6 7 8 |
1、匹配任意请求 location [=|~|~*|^~] /uri/ { … } 2、不区分大小写匹配以js、php结尾的请求 location ~* .(js|php)$ { … } 3、区分大小写匹配以.txt结尾的请求 location ~ ^.+\.txt$ |
2.3、匹配顺序如下图 按照上面的规则配置了如下location
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
location = /documents { return 200 'configuration A' } location /documents { return 200 'configuration B' } location /documents/txt1 { return 200 'configuration C' } location ^~ /documents/ { return 200 'configuration D' } location ~* /documents/(\w+)$ { return 200 'configuration E' } location ~ /documents/$ { return 200 'configuration F' } |
curl […]
View Details