前言
nginx中强大的功能,,如rewrite、proxy_pass都离不开他的匹配规则。搞懂nginx,学会高级的nginx用法,各种匹配优先级、匹配语法一定要知道
一. nginx location
1.语法规则和优先级
location [=|~|~*|!~|!~*|^~] /uri/ {
...
}
= > ^~ > ~|~*|!~|!*~** > /
精确匹配 > 字符开头 > 正则匹配 > 通配
server {
listen 192.168.93.136;
root /abcd;
index index.html;
location = / { index a.html; }
location ~ / { index b.html; }
location / { index c.html; }
}
# 测试页面 根据页面的不同内容来观察优先级
2.匹配顺序
除了优先级以外,还有一种少见的根据优先匹配顺序来决定使用哪个匹配,举个例子
图示:根据不同的匹配转发到不同的tomcat应用,都是用的~ 正则匹配
此时有一个url,如:http://ip:port/gwaf/report,可以看到,这个url同时满足两个匹配,那么该请求是转发到server2,还是server3呢。
答案是server2。同级别匹配规则,走先匹配到的匹配规则,从配置文件角度来看,就是从上到下的顺序,这里也就是匹配到了 ~ /(console|report),所以转发到server2。
那么就会出现一个问题,如若这个url是请求的server3里面的接口,应该转发到server3处理的,但却转发到server2,这时nginx会返回404,因为server2处理不了这个接口。这里有两种方法:可以尝试将~ /gwaf 匹配写到~ /(console|report) 匹配的前面,让~ /gwaf 优先匹配,转发到server3。或者使用^~ /gwaf ,使用开头匹配增加匹配优先级。
二. nginx rewrite
rewrite 将用户访问的url 重定向到一个新的url
下面通过几个rewrite匹配案例来看一下
案例1:rewrite url实现跳转
当访问http://192.168.93.136/aaa/a/1.html 时,重定向至http://192.168.93.136/ccc/bbb/1.html
mkdir -p /usr/share/nginx/html/ccc/bbb
mkdir -p /usr/share/nginx/html/aaa/a
vim /usr/share/nginx/html/aaa/a/1.html
vim /usr/share/nginx/html/ccc/bbb/1.html
vim /etc/nginx/conf.d/default.conf
location /aaa {
rewrite .* /ccc/bbb/1.html permanent; # url含有/aaa就会被重定向到 /ccc/bbb/1.html
}
测试页面 http://192.168.100.10/aaa/a/1.html 访问的url中含有"/aaa"字段就可以
permanent参数:
如果用了permanent 会直接显示新的url 新的网页内容,如果不使用 还是显示原来的url但是页面内容还是会显示转发后的。
以下匹配方法是否可行:
location = /aaa http://192.168.100.10/aaa/123.html是否可行
不可行。因为需要完全匹配
location ~ /aaa http://192.168.100.10/aaa/123.html是否可行
可行。因为部分匹配即可
location ^~ /aaa http://192.168.100.10/aaa/123.html是否可行
可行。因为部分匹配即可
案例2:rewrite中使用正则
将http://192.168.93.136/2017/a/1.html 换http://192.168.93.136/2018/a/2.html
mkdir -p 2018/a/
echo '2018' 2018/a/1.html
mkdir -p 2019/a
echo '2019' 2019/a/2.html
vim /etc/nginx/conf.d/default.conf
location /2018{
rewrite ^/2018/(.*)$ /2019/$1 permanent; # $1是指前面()里的内容,和shell的正则一样
}
访问测试 http://192.168.93.136/2018/a/1.html
案例3:主机名重定向
将http://liang.com 换http://kong.com
vim /etc/nginx/conf.d/default.conf
if ( $host ~* liang.com ) { # $host nginx内置变量
rewrite .* http://kong.com permanent;
}
访问测试 访问liang.com
案例4:域名重定向
将http://web.liang.com/a/1.html 换成 http://kong.com/a/1.html
建立两个虚拟主机 分别进行域名解析 创建2个主机的主页内容
echo 'web.liang' >a/1.html
echo 'kong' >a/1.html
if ( $host ~* liang.com ) {
rewrite .* http://kong.com$request_uri permanent;
}
访问测试 web.liang.com/a/1.html
案例5:php网站登录跳转
http://www.liang.com/login/liang.html 转为 http://www.liang.com/reg/login.php?user=liang
location /login {
rewrite ^/login/(.*)\.html$ /reg/login.php?user=$1;
}
案例6:http://alice.liang.com ==> http://www.liang.com/alice
http://jack.liang.com ==> http://www.liang.com/jack
if ($host ~* "^www.liang.com$") {
break; # 跳出匹配
}
if ($host ~* "^(.*)\.liang\.com$" ) {
set $user $1; # 设置变量
rewrite .* http://www.liang.com/$user permanent;
}
mkdir /usr/share/nginx/html/{jack,alice}
echo "jack" > /usr/share/nginx/html/jack/index.html
echo "alice" > /usr/share/nginx/html/alice/index.html
案例7:访问的.sh结尾的文件则返回403操作拒绝错误
location ~* \.sh$ {
return 403;
#return 301 http://www.liang.com;
}
案例8:http 转换 https
(1)云主机 购买域名 申请CA证书
(2)把CA证书下载下来 解压证书
(3)在配置文件中开启443 server
server {
listen 443;
server_name web.xxxx.com; # 域名
ssl on;
ssl_certificate /etc/pki/tls/certs/server.crt;
ssl_certificate_key /etc/pki/tls/certs/server.key; # 指定证书所存放的路径
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # 密码指定为OpenSSL支持的格式
ssl_prefer_server_ciphers on;
location / {
root /liang/html;
index index.html index.htm;
}
}
(4)启动证书
server {
listen 8080;
server_name 域名;
return 301 https://域名$request_uri;
}
(5)访问http 自动转到 https
案例9:last、break、redirect、permanent标记
mkdir /usr/share/nginx/html/test
echo 'break' > /usr/share/nginx/html/test/break.html
echo 'last' > /usr/share/nginx/html/test/last.html
echo 'test' > /usr/share/nginx/html/test/test.html
server {
listen 80;
server_name 192.168.93.136;
location / {
root /usr/share/nginx/html;
index index.html index.php;
}
location /break {
rewrite .* /test/break.html break;
root /usr/share/nginx/html;
}
location /last {
rewrite .* /test/last.html last;
root /usr/share/nginx/html;
}
location /test {
rewrite .* /test/test.html break;
root /usr/share/nginx/html;
}
}
访问测试 http://192.168.93.136/break 访问原站点
访问测试 http://192.168.93.136/last 自动跳转到下一个站点
|