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。

原文地址:https://blog.51cto.com/11886307/2403944

时间: 2024-10-14 08:17:58

Nginx Rewrite相关功能的相关文章

nginx之rewrite相关功能

Nginx Rewrite相关功能 Nginx服务器利用ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,nginx的正则表达式底层依赖于PCRE库,PCRE是用perl语言写的:rewrite是nginx服务器的重要功能之一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也

Nginx rewrite 重写功能和Nginx的正则表达式

一. Rewrite 跳转实现服务协议功能模块url 资源定位路径 nginx----支持url重写.支持if条件判断,但不支持else 跳转----循环最多可以执行10次,超过后nginx将返回500代码错误 rewrite----使用nginx'全局变量或自己设置的变量,结合正则表达式和标志位实现url重写以及重定向二.Rewrite 使用场景 使用rewrite进行匹配跳转 使用if匹配全局变量后跳转 使用location匹配再跳转1.rewrite放在 server{},if{},loc

nginx rewrite功能

Nginx rewrite 一.什么是Nginx rewrite Nginx rewrite 主要功能是实现URL地址重写.Nginx的 rewrite 规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配 二.Nginx rewrite 语法和参数介绍 1.Nginx rewrite 语法 rewrite regex replacement [flag]; rewrite:固定格式 regex: 正则表达式 replacement:重写后的URL flag: 重写状态标记

Nginx 之四: Nginx服务器的rewrite、全局变量、重定向和防盗链相关功能

一:Nginx 后端服务器组的配置: 1.upstream: 用于设置后端服务器组的主要指令,upstream类似于之前的server块或http块,用法如下: upstreame Myserver{ #ip_hash; #least_conn: #fair; #hash $request_uri; #hash_method crc32; server 192.168.0.2:8080 #weight 2 max_fails 3 fail_timeout 60; 192.168.0.3:8080

nginx——rewrite模块

1.什么是Nginx的Rewrite规则? Rewrite主要的功能就是实现URL的重写,Nginx的Rewrite规则采用PCRE(Perl Compatible Regular Expressions)Perl兼容正则表达式的语法进行规则匹配,如果 您需要Nginx的Rewrite功能,在编译Nginx之前,须要编译安装PCRE库. 通过Rewrite规则,可以实现规范的URL,根据变量来做URL转向及选择配置. (1)一些使用MVC框架的程序只有一个入口,可以通过Rewrite来实现. (

Nginx rewrite

Nginx rewrite 实现 URL 地址重写,即域名重定向,在安装 nginx 的时候需要安装 PCRE 来支持 rewrite 功能. 语法:rewrite  regex  replacement  [flag]   //表示如果匹配到正则regex,就跳转到replacement,rewrite是固定关键字,flag是标记 正则: \ :用于转义字符,如 \n 表示匹配换行 .\$ 表示匹配 $^ :匹配起始位置$ :匹配结束位置* :匹配前面的字符零次或多次,如 ab* 可以匹配 a

nginx rewrite标签配置以及用户认证配置

一.nginx  rewrite标签 rewrite 实现URL的改写主要是实现伪静态 1.  rewrite指令语法 指令语法:rewrite regex replacement[flag] 默认值:none 应用位置:server,location,if rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分内容,重定向到replacement部分内容,结尾是flag标记,下面是一个简单的URL Rewrite跳转 Rewrite ^/(.*)http://www.eti

Nginx Rewrite规则初探(转)

Nginx  rewrite(nginx url地址重写)Rewrite 主要的功能就是实现URL的重写,Nginx的Rewrite规则采用Pcre,perl兼容正则表达式的语法规则匹配,如果需要Nginx的Rewrite功能,在编译Nginx之前,需要编译安装PCRE库. 通过Rewrite规则,可以实现规范的URL.根据变量来做URL转向及选择配置. if        指令规则语法: [plain] view plain copy if ($http_user_agent ~MSIE){

Nginx Rewrite规则记录

Rewrite 是一种服务器的重写脉冲技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术.它还可以实现限制特定IP访问网站的功能.很多情况下,某个 IP 的访问很容易造成 CPU 100% (比如 某些搜索引擎的固定抓取,别人大量的采集站点),这个时候我们就要利用一些有效的手段封掉对方的 IP,让他无法消耗服务器的资源,封 IP 的方法有很多种,如果你的 Web(Nginx|Apache|other) 服务器安装了 Rewrite 模块的话,也可以试试利用 Rewrite