nginx配置rewrite的用法详解 - 蓝蓝设计_UI设计公司

帝皇彩票官网

追求卓越一诺千金

蓝蓝设计,2011年成立,主创清华团队,专注软件和互联网ui设计开发。擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI,好好学习,天天进步!


nginx配置rewrite的用法详解

2019-10-23 释然 前端及开发文章及欣赏


文章目录
rewrite在if中的用法
rewrite中break和last的用法
1.break和last在location{}外部时
2.break和last在location{}内部时
3.break和last用法总结
return的用法
rewrite的语法规则
rewrite应用实例
1.域名跳转(域名重定向)
2.http跳转https
3.跳转二级目录
4.动静态请求分离
5.防盗链配置
6.伪静态(将静态页面重写为动态)
7.多个if并用
rewrite在if中的用法
格式:if (条件判断) { 具体的rewrite规则 }

if条件判断语句由Nginx内置变量、逻辑判断符号和目标字符串三部分组成。
其中,内置变量是Nginx固定的非自定义的变量,如,$request_method, $request_uri等。
逻辑判断符号,有=, !=, ~, ~*, !~, !~*
!表示相反的意思,~为匹配符号,它右侧为正则表达式,区分大小写,而~*为不区分大小写匹配。
目标字符串可以是正则表达式,通常不用加引号,但表达式中有特殊符号时,比如空格、花括号、分号等,需要用单引号引起来。
1
2
3
4
5
示例1:当http请求方法为post时,返回403状态码

if ($request_method = POST)
{
    return 403; 
}
1
2
3
4
示例2:通过浏览器标识匹配关键字,禁止IE浏览器访问

if ($http_user_agent ~* MSIE) 
{
    return 403;
}
1
2
3
4
限制多个浏览器:

if ($http_user_agent ~* "MSIE|firefox|Chrome")
{
    return 403;
}
1
2
3
4
示例3:当请求的文件不存在时,进行重定向或return状态码等处理操作

if(!-f $request_filename)
{
    rewrite 语句;
}
1
2
3
4
示例4:判断uri中某个参数的内容

if($request_uri ~* 'gid=\d{6,8}/') 
{
    rewrite 语句;
}
1
2
3
4
#\d表示数字,{6,8}表示数字出现的次数是6到8次,当uri中gid参数的值包含6-8个数字那么执行rewrite语句

rewrite中break和last的用法
两个指令用法相同,但含义不同,需要放到rewrite规则的末尾,用来控制重写后的链接是否继续被nginx配置执行(主要是rewrite、return指令)。

1.break和last在location{}外部时
测试示例:

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;

    rewrite /1.html /2.html;
    rewrite /2.html /3.html;
}
1
2
3
4
5
6
7
8
#请求1.html文件时,会被重定向到2.html,然后被重定向到3.html,最后返回的文件为3.html

示例1:在rewrite 指令后面添加break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;

    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
}
1
2
3
4
5
6
7
8
#请求1.html文件时,会被重定向到2.html,然后直接返回2.html,break在此处的作用就是当匹配第一个rewrite指令成功时,不执行后面的rewrite指令

示例2:当break后面还有location{}的情况

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;

    rewrite /1.html /2.html break;
    rewrite /2.html /3.html;
    location /2.html {
        return 403;
    }
}
1
2
3
4
5
6
7
8
9
10
11
#请求1.html文件时,会返回403状态码,当1.html被重定向到2.html时,break不会匹配后面的rewrite规则,但条件2.html匹配location{}定义的文件2.html,所以会执行return 403

#以上两个示例中,将break换成last效果一样

2.break和last在location{}内部时
测试示例:

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#请求1.html,会经过两次重定向到3.html,3.html又刚好匹配location /3.html{},所以返回b.html,当请求2.html时,会直接返回a.html,因为location /2.html {} 更精准,优先匹配

示例1:在rewrite后面添加break

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html break;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#请求1.html,会返回2.html,不会返回a.html,当break再location {} 内部时,遇到break后,当前location{} 以及后面的location{} 的指令都不再执行

示例2:在rewrite后面添加last

server{
    listen 80; 
    server_name test.com;
    root /data/wwwroot/test.com;
    
    location / {
        rewrite /1.html /2.html last;
        rewrite /2.html /3.html;
    }
    location /2.html
    {
        rewrite /2.html /a.html;
    }
    location /3.html
    {
        rewrite /3.html /b.html;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#请求1.html时,会返回a.html,在location {} 内部遇到last,当前location {}中剩下的指令不会再执行,但被重定向的url会重新匹配一遍location {}

3.break和last用法总结
1.当rewrite规则在location{}外,break和last作用一样,遇到break或last后,其后续的rewrite/return语句不再执行。但后续有location{}的话,还会近一步执行location{}里面的语句,前提是请求能匹配该location
2.当rewrite规则在location{}里,遇到break后,本location{}与其他location{}的所有rewrite/return规则都不再执行
3.当rewrite规则在location{}里,遇到last后,本location{}里后续rewrite/return规则不执行,但重写后的url再次从头匹配所有location

return的用法
该指令一般用于对请求的客户端直接返回响应状态码。在该作用域内return后面的所有nginx配置都是无效的,可以使用在server、location以及if配置中,除了支持跟状态码,还可以跟字符串或者url链接。

示例1:直接返回状态码

server{
    listen 80;
    server_name www.test.com;
    return 403;
    rewrite www.test.net;  
}
1
2
3
4
5
6
#访问时,直接返回403状态码,return返回内容后,后面的配置rewrite不会执行

示例2:当return在if 判断中时

server {
.....

if ($request_uri ~ "\.password|\.bak")
{
    return 404;
    rewrite /(.*) /index.html;  
}
.....
}
1
2
3
4
5
6
7
8
9
10
#请求的文件包含.password或.bak时,直接返回404,rewrite不会执行,但if {}外的配置会继续执行,return只在当前作用域中生效

示例3:返回字符串

server{
    listen 80;
    server_name www.test.com;
    return 200 "hello";
}
1
2
3
4
5
#返回字符串必须加上状态码,否则会报错

示例4:返回nginx变量

location /1.html {
    return 200 "$host $request_uri";
}
1
2
3
示例5:返回url

server{
    listen 80;
    server_name www.test.com;
    return http://www.test.com/index2.html;
}
1
2
3
4
5
#返回url时,必须以http://或https://开头

示例6:返回html代码

if ($http_referer ~ 'baidu.com') 
{
    return 200 "<html><script>window.location.href='//$host$request_uri';</script></html>";
}
1
2
3
4
#当网站被黑了的时候,从百度点进网站是链接都会跳转到其他网站,可以使用该方法暂时处理
#注意:return http://$host$request_uri; 在浏览器中会提示"重定向的次数过多"

rewrite的语法规则
格式:rewrite regex replacement [flag]

rewrite 配置可以在server、location以及if配置段内生效

regex 是用于匹配URI的正则表达式,其不会匹配到$host(域名)

replacement 是目标跳转的URI,可以以http://或者https://开头,也可以省略掉$host,直接写$request_uri部分

flag 用来设置rewrite对URI的处理行为,其中有break、last、rediect、permanent,其中break和last在前面已经介绍过,rediect和permanent的区别在于,前者为临时重定向(302),而后者是永久重定向(301),对于用户通过浏览器访问,这两者的效果是一致的。
但是,对于搜索引擎爬虫来说就有区别了,使用301更有利于SEO。所以,建议replacemnet是以http://或者https://开头的,flag使用permanent。

示例1:域名跳转

location / {
    rewrite /(.*) http://www.test.com/$1 permanent;
}
1
2
3
# .*为正则表达式,表示uri,用()括起来,在后面的uri中可以调用它,第一次出现的()用$1调用,第二次出现的()用$2调用,以此类推。

示例2:域名跳转的第二种写法

location / {
    rewrite /.* http://www.test.com$request_uri permanent;
}
1
2
3
示例3:文件跳转

server{
    listen 80;
    server_name www.test.com;
    root /data/wwwroot/test.com;
    index index.html;
    if ($request_uri !~ '^/web/')
    {
        rewrite /(.*) /web/$1 redirect;
    }
}
1
2
3
4
5
6
7
8
9
10
#将uri请求的文件重定向到web/目录中去寻找

错误写法1:

server{
    listen 80;
    server_name www.test.com;
    root /data/wwwroot/test.com;
    index index.html;
    rewrite /(.*) /web/$1 redirect;
}
1
2
3
4
5
6
7
#这样写会反复循环,直到浏览器最大循环限制次数,哪怕uri包含web/目录了,也会继续重定向/web/web/$1

错误写法2:

server{
    listen 80;
    server_name www.test.com;
    root /data/wwwroot/test.com;
    index index.html;
    rewrite /(.*) /web/$1 break;
}
1
2
3
4
5
6
7
#添加break后不会导致循环,但如果uri中包含web/目录的情况下也会被重定向一次,重定向后的uri就是web/web/$1

rewrite应用实例
1.域名跳转(域名重定向)
单个域名的情况:

server{
    listen 80;
    server_name www.test.com;
    rewrite /(.*) http://www.test.net/$1 permanent;    
}
1
2
3
4
5
多个域名的情况:

server{
    listen 80;
    server_name www.test.com www.test.net;
    if ($host != 'www.test.net')
    {
        rewrite /(.*) http://www.test.net/$1 permanent;
    }
}
1
2
3
4
5
6
7
8
2.http跳转https
server{
    listen 80;
    server_name www.test.com;
    rewrite /(.*) https://www.test.com/$1 permanent;
}
1
2
3
4
5
3.跳转二级目录
server{
    listen 80;
    server_name bbs.test.com;
    rewrite /(.*) http://www.test.com/bbs/$1 last;
}
1
2
3
4
5
4.动静态请求分离
server{
    listen 80;
    server_name www.test.com;
    location ~* .*\.(jpg|jpeg|gif|css|png|js)$
    {
        rewrite /(.*) http://img.test.com/$1 permanent;
    }
}
1
2
3
4
5
6
7
8
#假设www.test.com的服务器在国外,访问速度较慢,img.test.com的服务器在国内,访问速度正常,可以将访问www.test.com静态文件的请求重定向到img.test.com,提高文件返回速度

第二种写法:

server{
    listen 80;
    server_name www.test.com;
    if ( $uri ~* 'jpg|jpeg|gif|css|png|js$')
    {
        rewrite /(.*) http://img.test.com/$1 permanent;
    }
}
1
2
3
4
5
6
7
8
5.防盗链配置
server{
    listen 80;
    server_name www.test.com;
    location ~* ^.+.(jpg|jpeg|gif|css|png|js|rar|zip|flv)$
    {
        valid_referers none blocked server_names *.test.com
        if ($invalid_referer)
        {
            return 403;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
#配置防盗链避免别的网站引用www.test.com不想被引用的图片等文件

http_referer表示从哪儿点击进网站的,比如从百度搜索引擎访问的
valid_referers:白名单
invalid_referer:无效的(未在白名单中定义的)
none:允许referer为空(也就是允许直接访问,未从其他站点跳转的请求)
blocked:允许来源地址不含http/https

6.伪静态(将静态页面重写为动态)
location /  {
    rewrite ^([^\.]*)/topic-(.+)\.html$ $1/portal.php?mod=topic&topic=$2 last;
    rewrite ^([^\.]*)/forum-(\w+)-([0-9]+)\.html$ $1/forum.php?mod=forumdisplay&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=viewthread&tid=$2&extra=page%3D$4&page=$3 last;
    rewrite ^([^\.]*)/group-([0-9]+)-([0-9]+)\.html$ $1/forum.php?mod=group&fid=$2&page=$3 last;
    rewrite ^([^\.]*)/space-(username|uid)-(.+)\.html$ $1/home.php?mod=space&$2=$3 last;
    rewrite ^([^\.]*)/(fid|tid)-([0-9]+)\.html$ $1/index.php?action=$2&value=$3 last;
}
1
2
3
4
5
6
7
8
#示例为discuz的伪静态配置

7.多个if并用
location /{
    set $a 0;
    if ($document_uri !~ '^/abc')
    {
        set $a "${a}1"; #uri不以/abc开头时,$a的值变为01
    }
    if ($http_user_agent ~* 'ie6|firefox')
    {
       set $a "${a}2"; #浏览器标识包含ie6或者Firefox时,$a的值变为012
    }
    if ($a = "012") #当满足前两个if判断时,重写url
    {
        rewrite /(.*) /abc/$1 redirect;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#nginx配置文件语法不支持if嵌套,需要通过多个if并用判断时,使用标识变量值的方式处理

蓝蓝设计www.bjhbys.com )是一家专注而深入的界面设计公司,为期望卓越的国内外企业提供卓越的UI界面设计、BS界面设计  cs界面设计  ipad界面设计  包装设计  图标定制  用户体验 、交互设计、 网站建设 平面设计服务
标签: nginx配置rewrite的用法详解 « 交互手势的容错性和逻辑性 | 中台是什么?听听大咖的看法»


蓝蓝 http://www.bjhbys.com

  1. 2019年10月(53)
  2. 2019年9月(48)
  3. 2019年8月(63)
  4. 帝皇彩票官网2019年7月(59)
  5. 2019年6月(59)
  6. 2019年5月(31)
  7. 帝皇彩票官网2019年4月(37)
  8. 帝皇彩票官网2019年3月(43)
  9. 2019年2月(26)
  10. 2019年1月(45)
  11. 2018年12月(41)
  12. 2018年11月(40)
  13. 2018年10月(29)
  14. 2018年9月(40)
  15. 2018年8月(87)
  16. 2018年7月(107)
  17. 2018年6月(86)
  18. 2018年5月(110)
  19. 2018年4月(40)
  20. 帝皇彩票官网2018年3月(35)
  21. 2017年8月(35)
  22. 2017年7月(45)
  23. 2017年6月(7)
  24. 2017年5月(27)
  25. 帝皇彩票官网2017年4月(51)
  26. 2017年3月(70)
  27. 2017年2月(65)
  28. 2017年1月(69)
  29. 2016年12月(55)
  30. 2016年11月(111)
  31. 2016年10月(92)
  32. 2016年9月(53)
  33. 2016年8月(9)
  34. 2016年7月(4)
  35. 2016年6月(9)
  36. 2016年3月(19)
  37. 2016年2月(26)
  38. 2016年1月(30)
  39. 2015年12月(33)
  40. 2015年11月(35)
  41. 2015年10月(46)
  42. 2015年9月(43)
  43. 2015年8月(40)
  44. 2015年7月(33)
  45. 2015年6月(46)
  46. 2015年5月(58)
  47. 2015年4月(70)
  48. 2015年3月(55)
  49. 2015年2月(17)
  50. 2015年1月(33)
  51. 2014年12月(21)
  52. 2014年11月(84)
  53. 2014年10月(94)
  54. 2014年9月(6)
  55. 2014年8月(1)
  56. 2014年7月(13)
  57. 2014年6月(66)
  58. 2014年5月(99)
  59. 2014年4月(88)
  60. 2014年3月(102)
  61. 2014年2月(68)
  62. 2014年1月(83)
  63. 2013年12月(106)
  64. 2013年11月(112)
  65. 2013年10月(61)
  66. 2013年9月(20)
  67. 2013年7月(13)
  68. 2013年6月(27)
  69. 2013年5月(48)
  70. 2013年4月(39)
  71. 2013年3月(8)
  72. 2013年2月(20)
  73. 2013年1月(31)
  74. 2012年12月(33)
  75. 2012年11月(31)
  76. 2012年10月(23)
  77. 2012年9月(8)
  78. 2012年7月(14)
  79. 2012年6月(15)
  80. 2012年5月(31)
  81. 2012年4月(24)
  82. 2012年2月(4)
  83. 2012年1月(8)
  84. 2011年12月(35)
  85. 2011年11月(32)
  86. 2011年10月(13)
  87. 2011年8月(1)
  88. 2011年6月(1)
订阅Rss
吉利彩票计划 上海时时乐 桔子彩票平台 贵州快3走势 帝皇彩票官网 迪士尼彩乐园主页 桔子彩票平台 桔子彩票注册 新疆喜乐彩 吉利彩票计划