Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Nginx 前要编译安装 PCRE 库。

一,Nginx使用if进行条件匹配

Nginx可以用if进行条件匹配,语法规则类似C

if (条件){...} ( 可用于: server,location )  ## 检查一个条件是否符合,如果条件符合,则执行大括号内的语句。不支持嵌套,不支持多条件 && ||

例如:if ($http_user_agent ~ MSIE) {rewrite  ^(.*)$  /msie/$1  break;}

1、正则表达式匹配,其中:

~  为区分大小写匹配 
~* 为不区分大小写匹配 
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

2、文件及目录匹配,其中:

-f和!-f用来判断是否存在文件 
-d和!-d用来判断是否存在目录 
-e和!-e用来判断是否存在文件或目录 
-x和!-x用来判断文件是否可执行

例如:if (!-f $request_filename) {proxy_pass  http://127.0.0.1;}

Wordpress的重定向规则:

if (!-e $request_filename) {rewrite ^/(index|atom|rsd)\.xml$ http://feed.shunz.net last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last;}

return ( 可用于: server,location,if )  ## 用于结束规则的执行并反回状态码给客户端。  状态码可以是 :204/400/402~406/408/410/411/413/416/500~504

如:location ~ .*\.(sh|bash)?$ {  
      return 403;  
    }  
## 访问的 URL 以 .sh .bash 结尾的,则返回 403 。

204  No Content  
400  Bad Request  
402  Payment Required  
403  Forbidden  
404  Not Found  
405  Method Not Allowed  
406  Not Acceptable  
408  Request Timeout  
410  Gone  
411  Length Required  
413  Request Entity Too Large  
416  Requested Range Not Satisfiable  
500  Internal Server Error  
501  Not Implemented  
502  Bad Gateway  
503  Service Unavailable  
504  Gateway Timeout

二,Nginx使用rewrite

rewrite ( 可用于: server,location,if ) ## 重写 URL ,或修改字符串。重写 URL 只对相对路径有效,如想对主机名,要使用 if 语句。

例1:
if ($host ~* www\.(.*)) {  
      set $host_without_www $1;  
      rewrite ^(.*)$ http://$host_without_www$1 permanent;  
}  
## 如果替换串以 http:// 开头,将会采用 301 或 302 跳转进行 URL 重定向。

例2:
rewrite ^/feed/$ http://feed.shunz.net last;

Nginx的Rewrite规则与Apache几乎完全一致,所不同的是最后的flag标记,Nginx的rewrite指令后支持的标记有last,break,redirect,permanent

last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则 
break ( 可用于: server,location,if ) ## 本条规则匹配完成后,终止匹配,不再匹配后面的规则

如:rewrite ^/b/(.*)\.html /play.php?video=$1 break;

redirect 返回302临时重定向,浏览器会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器会显示跳转后的URL地址

last/break用来实现URL重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。
redirect/permanent实现URL跳转,浏览器地址栏URL会显示跳转后的URL。
使用 alias 指令时必须用 last 标记 ,使用 proxy_pass 指令时要用 break 表示。last 标记在本条 rewrite 规则执行完毕后,会对其所在 server{....}标签重新发起请求,而 break 标记则在本条规则匹配完成后,终止匹配。

如:location /cms/ {  
      proxy_pass http://test.abc.com;  
      rewrite "^/cms/(.*)\.html$" /cms/index.html break;  
}

## 这条规则如果使用 last 会导致死循环。  
## 一般在根 location 中(即 location / {....})或直接在 server 标签编写 rewrite 规则,推荐使用 last 标记,  
       在非根 location 中 (即 location /cms/ {...}),则使用 break 标记。

Nginx $document_uri参数的使用

$document_uri  表示访问的url 现在我的需求是,访问 www.abc.com  请求到 www.abc.com/abc/

在nginx配置文件中加入

if ($document_uri !~ 'abc')
    {
            rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
    }

而不是单独加一句  rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
如果只加rewrite 规则,而不限定条件,那么会造成死循环。  会访问到   http://www.abc.com/abc/abc/abc/abc/....

转载于:https://blog.51cto.com/11759015/1877522

Nginx的rewrite应用相关推荐

  1. index.php?s=$1,thinkphp nginx配置rewrite,地址会多出个.php

    thinkphp nginx配置rewrite,地址会多出个.php ,http://localhost:7080/.php?m=... nginx配置文件 server { listen 80; # ...

  2. php ci nginx 伪静态rewrite配置方法

    php ci nginx 伪静态rewrite配置方法 location / {if (!-e $request_filename) {rewrite ^(.*)$ /index.php?s=/$1 ...

  3. nginx的rewrite 参数和例子

    nginx的rewrite 参数和例子 正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中 ...

  4. 第七章:nginx的rewrite规则详解

    模块ngx_http_rewrite_module 该ngx_http_rewrite_module模块用于使用PCRE正则表达式更改请求URI,返回重定向,并有条件地选择配置. 句法: break; ...

  5. Nginx之rewrite配置

    Rewtrite : 其主要目的是为了进行URL 重写,进行URL重定向.主要采用PCRE: Perl Compatible Regular Expressions(Perl兼容正则表达式语法)进行规 ...

  6. php选择nginx还是apache,浅谈apache和nginx的rewrite的区别

    1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx ...

  7. Nginx的rewrite模块疑问排查

    标题索引 追溯原因 实验分析 原理总结 追踪原因 最近心态"一步一印,有印为证",在Nginx的rewrite模块在工作过程中,客户端发起包到服务器解包整体过程浏览器做了什么?服务 ...

  8. 实例演示Nginx重写(Rewrite)类型last、break、redirect和permanent的区别

    本文使用之前制作的Docker容器<<Docker案例:搭建nginx服务>>演示Nginx四种重写类型的区别和效果,如果尚未构建Docker服务可参考之前的文章,或者自建Ng ...

  9. centos 7.6——Nginx中rewrite模块应用(location)——基于域名的跳转等

    centos 7.6--Nginx中rewrite模块应用(location)--基于域名的跳转等 文章目录 centos 7.6--Nginx中rewrite模块应用(location)--基于域名 ...

最新文章

  1. android 更新 18个月,MIUI迎接史上最大更新:18个月内绝不卡顿,友商羡慕!
  2. 封装html5,封装Html5 Fullscreen API
  3. 如果连接远程的mysql数据库连不上,可用下面的方法试下
  4. “是福不是祸,是祸躲不过”这句话对吗?
  5. PyTorch1.0 教程 例子和书籍
  6. LVS负载均衡-NET、DR模式配置
  7. API函数MessageBox的参数与返回值
  8. 10个加速Table Views开发的Tips
  9. 8.String、StringBuffer、enum枚举
  10. java撕裂_屏幕撕裂与卡顿分析
  11. 重装系统Win10电脑磁盘被写保护怎么办
  12. 能源路由器 :分布式智能电网应用的混合通信体系结构
  13. 关于结合二阶条件(海森矩阵)来判断非凸函数极值问题?
  14. 号外 ! 号外 ! V7包下的View都来此参加同学会 , 快来看,快来看...
  15. 欧姆龙CP系列PLC以太网通讯连接SCADA介绍
  16. 数学符号 - 罗马字母
  17. 程序员春招是什么时候?什么是金三银四?
  18. 树状数组的进阶运用(Stars 数星星)
  19. rtux64w10.sys导致DRIVER_IRQL_NOT_LESS_OR_EQUAL蓝屏的解决方法
  20. 爬虫中遇到的问题Crawled (404),[scrapy.spidermiddlewares.offsite] DEBUG: Filtered offsite request to

热门文章

  1. 数据结构:堆排序一(heap sort)
  2. 《编码:隐匿在计算机软硬件背后的语言(美)》读书笔记三
  3. go微服务框架-gomicro试用
  4. 让程序员薪资上升一个level的良心十条建议,你有做到吗?
  5. Java6.0中Comparable接口与Comparator接口详解
  6. 求android实现未读短信图标数字提示效果
  7. Android的启动脚本–init.rc
  8. list替换某一项需要遍历比对再set到对应的position
  9. Node.js webpack-dev-server配置命令的两种方式
  10. iOS----------苹果警告