wuaji 发表于 2018-11-11 13:20:04

nginx指令之rewrite

  语法:rewriteregex replacement flag
  默认值:none
  使用环境:server,locacation,if
  该指令根据表达式来重定向URL,或者修改字符串。指令根据配置文件中的顺序来执行。
  注意:重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句,代码如下:
if ($host ~* www\.(.*)) {  
    set    $host_without_www $1;
  
    rewrite ^(.*)$permanent;
  
}
  如果替换串以http://开头,将会才用301或者302跳转进行URL重定向。
  nginx的rewrite规则参考:
  ~ 为区分大小写匹配
  ~* 为不区分大小写匹配
  !~和!~*分别为区分大小写不匹配及不区分大小写不匹
  -f和!-f用来判断是否存在文件
  -d和!-d用来判断是否存在目录
  -e和!-e用来判断是否存在文件或目录
  -x和!-x用来判断文件是否可执行
  rewrite指令的最后一项参数为flag标记,支持的flag标记有以下四种:
  last   相当于apache里的L标记,表示完成rewrite
  break    本条规则匹配完成后,终止匹配,不再匹配后面的规则
  redirect 返回302临时重定向,浏览器地址会显示跳转后的URL。
  permanent返回301永久重定向,浏览器地址会显示跳转后的URL。
  nginx rewrite可以用到的全局变量:
  $args
  $content_length
  $content_type
  $document_root
  $document_uri
  $hosts
  $http_user_agent
  $http_cookie
  $limit_rate
  $request_body_file
  $request_method
  $remote_addr
  $remote_port
  $remote_user
  $request_filename
  $request_uri
  $query_string
  $scheme
  $server_protocol
  $server_addr
  $server_name
  $server_port
  $uri
  #知识普及
URL是全球资源定位符的英文所写,您平时上网时在IE浏览器中输入的那个地址就是URL。比如:网易 就是一个URL。  
   URI是Web上可用的每种资源 - HTML文档、图像、视频片段、程序,由一个通过通用资源标志符(Universal Resource Identifier, 简称"URI")进行定位。
  
   URL的格式由下列三部分组成:
  
第一部分是协议(或称为服务方式);
  
第二部分是存有该资源的主机IP地址(有时也包括端口号);
  
第三部分是主机资源的具体地址。
  
URI一般由三部分组成:
  
访问资源的命名机制。
  
存放资源的主机名。
  
资源自身的名称,由路径表示。
  在以上的标记中,last和break用来实现URI重写,浏览器地址栏的URL地址不变,但在服务器端访问的路径发生了改变。
  redirect和permanent用来实现URL跳转,浏览器地址会显示跳转后的URL。
  last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite匹配完成后,终止匹配,不再匹配后面的规则。例如下面这个例子,就必须使用break标记,使用last标记会导致死循环。
location /cms/ {  
    proxy_pass   rewrite ^/cms/(.*)\.html$ /cms/index.html break;
  
}
  因此,一般在根location中,即(location / {...})或直接在server标签中编写rewrite规则,推荐使用last标记,在非根location中,例如location /cms/{...},则使用break标记。例如:
server {  
    ...
  
rewrite ^(/download/.*)/media/(.*)\..$ $1/mp3/$2.mp3 last;
  
rewrite ^(/download/.*)/audio/(.*)\..$ $1/mp3/$2.ra last;
  
return 403;
  
    ...
  
}
  
location /download/ {
  
rewrite ^(/download/.*)/media/(.*)\..$ $1/mp3/$2.mp3 break;
  
rewrite ^(/download/.*)/audio/(.*)\..$ $1/mp3/$2.ra break;
  
return 403;
  
}
  如果被替换的URI中含有参数,类似/app/test.php?id=5之类的(URI),默认情况下参数会被自动附加到替换串上,你可以通过在替换串的末尾加上?标记来解决这一问题。
rewrite ^/user/(.*)$ /show?user=$1 last;  下面我们来比较一下,不加?标记和加上?标记的URL跳转区别:
rewrite ^/test(.*)$permanent;  访问 www.baidu.com/test?id=5 经过301跳转后的URL地址为www.baidu.com/home?id=5
rewrite ^/test(.*)$ http://www.baidu.com/home? permanent;  访问 www.baidu.com/test?id=5 经过301跳转后的URL地址为www.baidu.com/home
  # 对花括号{} 来说,它既能用在重定向的正则表达式里,也能用在配置文件里分割代码块。为了避免冲突,正则表达式里如果带花括号,应该用双引号或者单引号包围,比如:类似这样的url
  /photo/123456.01
  重定向到
  /path/to/photos/12/1234/picture.01.png
  可以用以下方法:
rewrite "/photo/({2})({2})({2})" /path/to/photos/$1/$1$2/$1$2$3.png  其余链接http://304076020.blog.51cto.com/7503470/1424073


页: [1]
查看完整版本: nginx指令之rewrite