Nginx Rewrite相关功能
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx Rewrite相关功能相关的知识,希望对你有一定的参考价值。
nginx Rewrite相关功能Nginx服务器利用ngx_http_rewrite_module模块处理rewrite请求,此功能依靠RCRE(perl compatible regularexpression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需 其他网站修改我们的链接,就可以设置为访问,另外还可以在一定程度上提高网站的安全性。
Nginx_http_rewrite_module模块指令
rewrite模块相关的指令有break、if、return、rewrite、rewrite_log、set
if指令
用于条件匹配的判断,并根据条件判断结果选择不同的nginx配置,可以配置在server或Location块中进行配置,Nginx的if语法仅能使用if做单次判断。不支持使用if...else或者if...elif这种多重判断
#语法格式
if (条件匹配)
action
if指令需要使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为ture,否则认为false。变量与表达式之间用符号进行连接
=: #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false。
!=: #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false。
~: #表示在匹配过程中区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足为假。
~*: #表示在匹配过程中不区分大小写字符,(可以通过正则表达式匹配),满足匹配条件为真,不满足问假。
!~:#区分大小写不匹配,不满足为真,满足为假,不满足为真。
!~*:#为不区分大小写不匹配,满足为假,不满足为真。
-f 和 ! -f: #判断请求的文件是否存在和是否不存在
-d 和 ! -d: #判断请求的目录是否存在和是否不存在。
-x 和 ! -x: #判断文件是否可执行和是否不可执行。
-e 和 ! -e: #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
示例:
1.= 判断用户请求的值是否等于所设定的值,如果匹配成功则执行后面的命令
判断用户请求的scheme是否为http
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $scheme = http )
echo scheme is $scheme;
测试访问
[[email protected] ~]# curl http://www.mylinuxops.com
scheme is http
2.!= 判断用户的是否不等于所设定的值,如果不等于则执行后面的命令
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $scheme != http )
echo scheme is $scheme;
测试访问
[[email protected] ~]# curl http://www.mylinuxops.com
mylinuxops.com #由于$scheme和http相等所以执行默认操作,输出默认页面
3.判断文件是否存在,如果存在输出文件存在
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( -f $request_filename )
echo "file is exist";
测试访问
[[email protected] ~]# curl http://www.mylinuxops.com
file is exist #主页文件存在所以输出一个文件存在的信息
4.判断文件是否不存在,如果不存在输出文件不存在
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( !-f $request_filename )
echo "file is not exist";
测试访问一个不存在的文件
[[email protected] ~]# curl www.mylinuxops.com/123
file is not exist #输出文件不存在
在生产环境中,如果文件不存在应该将其重定向到一个可以访问的页面
break指令
用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的指令配置就不再生效了,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和location块以及if块中使用。
用到此指令的场景不多,一般在判断中使用,就是跳出后不再执行location后续的操作
示例:
1.没有使用break时
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
set $name mylinuxops;
echo $name;
#break;
set $my_port $server_port;
echo $my_port;
测试
[[email protected] ~]# curl www.mylinuxops.com
mylinuxops
80
使用break后
[[email protected] ~]# curl www.mylinuxops.com
mylinuxops #后面端口号部分被打断没有输出
return指令
从nginx版本0.8.2开始支持,return用于完成对请求的处理,并直接向客户端返回响应状态码,比如其可以指定重 定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令 后的所有配置都将不被执行,return可以在server、if和location块进行配置
#语法格式
return code [text]; #返回一个状态相应码+一段字符串
return code URL; #返回一个状态相应码+跳转的URL
return URL; #返回一个URL重定向到新的URL
示例:
1.return code [test];
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $uri = /123 )
return 404 "not exist";
测试
[[email protected] ~]# curl -I www.mylinuxops.com/123
HTTP/1.1 404 Not Found #返回一个404值
Server:
Date: Fri, 31 May 2019 13:50:58 GMT
Content-Type: application/octet-stream
Content-Length: 9
Connection: keep-alive
Keep-Alive: timeout=65
[[email protected] ~]# curl www.mylinuxops.com/123
not exist #输出一个not exist字符串
2.return code URL;
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $uri = /123 )
return 327 http://www.mylinuxops.com;
测试
[[email protected] ~]# curl -I www.mylinuxops.com/123
HTTP/1.1 327 #返回327值
Server:
Date: Fri, 31 May 2019 13:55:48 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Keep-Alive: timeout=65
Location: http://www.mylinuxops.com #跳转的url
3.return URL;
[[email protected] ~]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $uri = /123 )
return http://www.mylinuxops.com;
测试
[[email protected] ~]# curl -I www.mylinuxops.com/123
HTTP/1.1 301 Moved Permanently
Server:
Date: Fri, 31 May 2019 13:58:43 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Keep-Alive: timeout=65
Location: http://www.mylinuxops.com
rewrite指令
通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序一次对URI进行匹配,rewrite主要是正对用户请求的URL或者是URI做具体处理
#语法格式
rewrite regex replacement [flag];
flag可以是last,break,redirect,permanent中的任意一个
last:重写完成后,对新的uri再次进行匹配
break:当重写完成后,就不再进行匹配直接输出改写后的uri
redirect:重写完成后以临时重定向的方式直接返回重写生后生成的新URL给客户端,由客户端发起新的请求;状态码302
permanent:重写完成后以永久重定向的方式生成新的URL发送给客户端,客户端重新发起连接,状态码301
临时重顶向和永久重定向的区别:
永久重定向会在浏览器中做缓存,当用户下次访问时会直接查缓存然后去访问重定向后的站点,这种重定向一般用在站点域名不再使用的情况下。
临时重定向不会做缓存,下次访问时浏览器依旧会先去站点,站点返回一个重定向,然后用户端再次发起请求访问重定向的域名,一般用在临时不让用户访问的情况下。
示例:
1.redirect
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $scheme = http )
rewrite / https://www.mylinuxops.com$uri redirect;
测试:
[[email protected] www]# curl -I www.mylinuxops.com/image
HTTP/1.1 302 Moved Temporarily #302临时重定向
Server:
Date: Fri, 31 May 2019 16:05:11 GMT
Content-Type: text/html
Content-Length: 154
Connection: keep-alive
Keep-Alive: timeout=65
Location: https://www.mylinuxops.com/image #所有的http请求都被送往了https
2.permanent
[[email protected] www]# vim /apps/nginx/conf/servers/vs.conf
server
server_name www.mylinuxops.com;
access_log /var/log/nginx/access.log access_json;
location /
root /data/www;
index index.html;
if ( $scheme = http )
rewrite / https://www.mylinuxops.com permanent;
测试
[[email protected] www]# curl -I www.mylinuxops.com
HTTP/1.1 301 Moved Permanently #301永久重定向
Server:
Date: Fri, 31 May 2019 16:17:44 GMT
Content-Type: text/html
Content-Length: 178
Connection: keep-alive
Keep-Alive: timeout=65
Location: https://www.mylinuxops.com
3.break和last
修改配置文件
location /break
root /data/www;
index index.html;
rewrite ^/break/(.*) /test/$1 break;
location /last
rewrite ^/last/(.*) /test/$1 last;
location /test
index index.html;
root /data/www/hello;
在/data/www下建一个test目录创建一个index.html
[[email protected] test]# cat /data/www/test/index.html
123
在/data/www/hello下建一个test目录创建一个index.html
[[email protected] test]# cat /data/www/hello/test/index.html
test2
测试查看break和last的区别
[[email protected] ~]# curl www.mylinuxops.com/break/index.html
123 #访问break时输出的是/data/www/test/index.html的内容
[[email protected] ~]# curl www.mylinuxops.com/last/index.html
test2 #访问last时输出的是/data/www/hello/test/index.html的内容
结论:
break在重写后会在root所定义的目录下寻找rewrite的uri。break常用于多版本的资源并存时的调用,访问方式不变改变访问的资源。
last在重写后会再次使用新的uri去匹配各location。
以上是关于Nginx Rewrite相关功能的主要内容,如果未能解决你的问题,请参考以下文章
Nginx 之四: Nginx服务器的rewrite全局变量重定向和防盗链相关功能