赞
踩
最近工作用到了nginx,但是路由配置特殊,业务场景复杂,因此整理了集中nginx跳转的配置方式,如servername的正则,location的匹配顺序,rewrite和proxy的示例,相信总有一种满足你的需求。
server name 为虚拟服务器的识别路径。因此不同的域名会通过请求头中的HOST字段,匹配到特定的server块,转发到对应的应用服务器中去。server_name匹配规则:后面可以跟多个域名,第1个是主域名
如下nginx配置
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!
server {
listen 8080;
server_name test1.*;
location / {
return 200 "I am test1!\n";
}
}
listen 8080;
server_name *.test.com;
location / {
return 200 "I am mytest!\n";
}
}
nginx: [emerg] invalid server name or wildcard "my.*.com" on 0.0.0.0:8080
server {
listen 8080;
server_name ~^my(?<serno>.+).mydomain.com$;
location / {
return 200 $serno;
}
}
解释说明
请求结果
curl http://my02.mydomain.com:8080 返回:02%
curl http://my03.mydomain.com:8080 返回:03%
location [=|~|~*|^~] /uri/ { … }
匹配的正则符号如下:
1、匹配任意请求
location [=|~|~*|^~] /uri/ { … }
2、不区分大小写匹配以js、php结尾的请求
location ~* .(js|php)$ { … }
3、区分大小写匹配以.txt结尾的请求
location ~ ^.+\.txt$
按照上面的规则配置了如下location
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' }
编译的时候加上 --with-debug选项,例如 ./configure --with-debug
conf文件加上要debug的host,debug_connection对应要debug的连接。
events {
worker_connections 1024;
debug_connection 192.168.1.3;
debug_connection 127.0.0.1;
}
error.log查看debug日志,图中test location就是正则匹配的过程
语法如下:
指令语法:rewrite regex replacement[flag];
默认值:none
应用位置:server、location、if
rewrite是实现URL重定向的重要指令,他根据regex(正则表达式)来匹配内容跳转到replacement,结尾是flag标记.
flag标记 | 说明 |
---|---|
last | 本条规则匹配完成后继续向下匹配新的location URI规则 |
break | 本条规则匹配完成后终止,不在匹配任务规则 |
redirect | 返回302临时重定向 |
permanent | 返回301永久重定向 |
return三种code,code url和url。
返回状态码:444表示关闭连接 301表示http1。0中永久重定向,302表示临时重定向,进制缓存。http1.1后,303表示临时重定向,允许改变方法,进制缓存,307表示临时重定向,不允许改变方法,禁止被缓存,308表示永久重定向,不允许改变方法。
location / {
return 301 https://www.xxxx.com$request_uri;
}
rewrite ^ https://www.xxxx.com$request_uri? permanent;
rewrite ^/(.*)$ https://www.xxxx.com/$1;
server {
listen 80;
server_name test1.net test2.net;
if ($host != 'test1.net' ) {
rewrite ^/(.*)$ http://www.baidu.net/$1 permanent;
}
}
打开日志开关rewrite_log on;
可以配置到http,server,location和if上下文中
示例:curl http://test1.com:8080/first/2.txt
location /first {
rewrite_log on;
rewrite /first(.*) /second$1 last;
}
效果图如下
对上游服务使用http/https协议进行反向代理。proxy_pass后面跟url,可以仿造location,if in location和limit_except上下文中。 这个功能是默认编译到nginx中的。本文重点讨论http proxy。
url参数规则
http示例
proxy_pass http://localhost:8000/uri/;
UNIX域套接字路径来定义示例
proxy_pass http://unix:/tmp/backend.socket:/uri/;
├── first
│ └── index.html
├── index.html
└── second
└── index.html
nginx配置如下
server { listen 8081; server_name my.test.com; } server { listen 8082; # 第一种情况 location /first { proxy_pass http://my.test.com:8081; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } # 第二种情况 location /first { proxy_pass http://my.test.com:8081/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
不带/,然后 curl http://127.0.0.1:8082/first/index.html 返回index html
带/,然后 curl http://127.0.0.1:8082/first/index.html 返回first index
Url参数中可以携带变量proxy_pass http://$host$uri;
可以配合rewrite break语句
location /nameb/ {
rewrite /nameb/([^/]+) /test?nameb=$1 break;
proxy_pass http://127.0.0.1:8801/;
}
配置nginx的路由,有多种方式,域名可以用server_name配置,uri可以用location配置,复杂的可以加rewrite配置修改请求。还有就是配置proxy代理,在代理中转发id等。
转自:https://juejin.cn/post/7001776339996901407/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。