nginx rewrite学习笔记

标签: nginx rewrite 学习 | 发表时间:2013-03-04 19:47 | 作者:wz510541136
出处:http://blog.csdn.net

一、什么是Rewrite

  Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他

  URL的过程。URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页

  面方式的一种技术。比如http://www.123.com/news/index.asp?id=123 使用

  URLRewrite 转换后可以显示为 http://www.123.com/news/123.html

  对于追求完美主义的网站设计师,就算是网页的地址也希望看起来尽量简洁明快。形如

  http://www.123.com/news/index.asp?id=123的网页地址,自然是毫无美感可言,而用

  UrlRewrite技术,你可以轻松把它显示为 http://www.123.com/news/123.html。

  理论上,搜索引擎更喜欢静态页面形式的网页,搜索引擎对静态页面的评分一般要高于

  动态页面。所以,UrlRewrite可以让我们网站的网页更容易被搜索引擎所收录。

  从安全角度上讲,如果在url中暴露太多的参数,无疑会造成一定量的信息泄漏,可能

  会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的url地址可以给我们带来更

  高的安全性。

二、Rewrite相关指令

  Nginx Rewrite相关指令有if、rewrite、set、return等。

  if 的语法 应用于 server和location环境内

  if (condition) { … }

  if可以支持如下条件判断匹配符号

  ~ 为区分大小写匹配

  ~* 为不区分大小写匹配

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

  -f 和!-f 用来判断是否存在文件

  -d 和!-d 用来判断是否存在目录

  -e 和!-e 用来判断是否存在文件或目录

  -x 和!-x 用来判断文件是否可执行

  在匹配过程中可以引用一些Nginx的全局变量,更多的变量请参考

   http://wiki.nginx.org/NginxHttpCoreModule 的 Variables 部分

  $args, 请求中的参数;

  $document_root, 针对当前请求的根路径设置值;

  $host, 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;

  $limit_rate, 对连接速率的限制;

  $request_method, 请求的方法,比如"GET"、"POST"等;

  $remote_addr, 客户端地址;

  $remote_port, 客户端端口号;

  $remote_user, 客户端用户名,认证用;

  $request_filename, 当前请求的文件路径名

  $query_string, 与$args相同;

  $scheme, 所用的协议,比如http或者是https

  $server_protocol, 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";

  $server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用

  以取得地址(造成资源浪费);

  $server_name, 请求到达的服务器名;

  $document_uri 与$uri一样,URI地址;

  $server_port, 请求到达的服务器端口号;

  看了一大堆也许会有点晕,当然有时晕着晕着也就习惯了。不过我们还是先来看两个例

  子。这样更有助于理解。

  例 匹配访问的url地址是否是个目录

  if (-d $request_filename) {

  …;

  }

  例 匹配访问的地址是否以www开头

  if ($hosts ~* ^www) {

  …;

  }

  rewrite 指令根据表达式来重定向URI,或者修改字符串。可以应用于server,

  location, if环境下 每行rewrite指令最后应该根一个flag标记,支持的flag标记有

  last 相当于Apache里的[L]标记,表示完成rewrite

  break 本条规则匹配完成后,终止匹配,不再匹配后面的规则

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

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

  last和break标记的区别在于,last标记在本条rewrite规则执行完后,会对其所在的

  server { … } 标签重新发起请求,而break标记则在本条规则匹配完成后,停止匹配,不

  再做后续的匹配。另有些时候必须使用last,比如在使用alias指令时,而使用proxy_pass

  指令时则必须使用break。

  例:以下这段rewrite会导致死循环

  location /abc/ {

  rewrite “^/abc/(.*)\.html$” /abc/index.html last;

  }

  我们应该将上面的last改成break以避免死循环。

  redirect和 permanent区别则是返回的不同方式的重定向,对于客户端来说一般状态

  下是没有区别的。而对于搜索引擎,相对来说301的重定向更加友好,如果我们把一个地址

  采用301跳转方式跳转的话,搜索引擎会把老地址的相关信息带到新地址,同时在搜索引擎

  索引库中彻底废弃掉原先的老地址。

  使用302重定向时,搜索引擎(特别是google)有时会查看跳转前后哪个网址更直观,

  然后决定显示哪个,如果它觉的跳转前的URL更好的话,也许地址栏不会更改,那么很有

  可能出现URL劫持的现像。

  我们在做URI重写时,有时会发现URI中含有相关参数,如果需要将这些参数保存下

  来,并且在重写过程中重新引用,我们可以用到 () 和 $N 的方式来解决。

  例:匹配访问的url地址是否是个目录,如果是则自动加个 /

  if (-d $request_filename) {

  rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

  }

  例:用户访问的网址为www.test.com/abc.html 重写后真实地址是

  www.test.com/login.php?user=abc

  location ~* /php/.*\.html$ {

  rewrite /php/(.*)\.html /login.php?user=$1 last;

  }

  例:用户访问地址为/uplook/11-22-33.html重写后真实地址为

  /uplook/11/22/33.html

  location /uplook/ {

  rewrite /uplook/([0-9]+)-([0-9]+)-([0-9]+).html /uplook/$1/$2/$3.html last;

  }

  set 指令是用于定义一个变量,并且赋值。应用于server,location,if环境。

  语法格式为: set $变量名 变量值

  例:当访问任意目录下的whoami.html都重定向到 /who.html

  location ~* .*/whoami\.html$ {

  set $who 'who.html';

  rewrite .* /$who break;

  }

  return 指令用于返回状态码给客户端,应用于server,location,if环境。

  例:如果访问的 .sh 结尾的文件则返回403操作拒绝错误

  location ~* .*\.sh$ {

  return 403;

  }




作者:wz510541136 发表于2013-3-4 19:47:34 原文链接
阅读:60 评论:0 查看评论

相关 [nginx rewrite 学习] 推荐:

nginx rewrite学习笔记

- - CSDN博客互联网推荐文章
  Rewrite对称URL Rewrite,即URL重写,就是把传入Web的请求重定向到其他. URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页. 比如http://www.123.com/news/index.asp?id=123 使用.   URLRewrite 转换后可以显示为 http://www.123.com/news/123.html.

nginx 重写 rewrite 基础及实例

- - 开源软件 - ITeye博客
nginx rewrite 正则表达式匹配. ~* 为不区分大小写匹配 . !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 . -f和!-f用来判断是否存在文件 . -d和!-d用来判断是否存在目录 . -e和!-e用来判断是否存在文件或目录 . -x和!-x用来判断文件是否可执行 . last 相当于Apache里的[L]标记,表示完成rewrite.

nginx配置location总结及rewrite规则写法

- - SegmentFault 最新的文章
已 =开头表示精确匹配. 如 A 中只匹配根目录结尾的请求,后面不能带任何字符串. ^~ 开头表示uri以某个常规字符串开头,不是正则匹配. ~ 开头表示区分大小写的正则匹配;. ~* 开头表示不区分大小写的正则匹配. / 通用匹配, 如果没有其它匹配,任何请求都会匹配到. (location =) > (location 完整路径) > (location ^~ 路径) > (location ~,~* 正则顺序) > (location 部分起始路径) > (/).

nginx学习研究(一)安装启动及调试

- - CSDN博客推荐文章
序:从今天开始研究nginx. 主要是工作中用到大量的nginx的安装调试及优化,希望可以系统的记录一下,以备以后不时之需. 对于nginx不建议使用源来安装,最好自己编译. 因为一般来说使用nginx的项目都比较灵活,而且基本上不同平台或系统的批量部署比较多. 通过编辑安装可以比较效率的按照自己想要的方式进行批处理.

为Nginx加入一个使用深度学习的软WAF

- - FreeBuf互联网安全新媒体平台
本文介绍如何向Nginx增加了一个使用Tensorflow C库的软WAF模块,模块主体基于Naxsi. 这里,之前有Dalao发表过这样一篇文章: 基于卷积神经网络的SQL注入检测. 这是一个开源的项目,但是由于速度的关系,我不打算使用这篇文章的模型,仅仅采用这篇文章使用的数据集. 这样可以节省很多特征工程的时间.

nginx配置ssl

- - 邢红瑞的blog
先生成网关证书 ,仿照CA模式.

Nginx安装

- - 企业架构 - ITeye博客
nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环境可以使用以下指令. centos平台编译环境使用如下指令. 一般我们都需要先装pcre, zlib,前者为了重写rewrite,后者为了gzip压缩.

Nginx GZip 压缩

- - 开心平淡对待每一天。热爱生活
  Nginx GZip 模块文档详见: http://wiki.nginx.org/HttpGzipModule 常用配置片段如下:. # 压缩比例,比例越大,压缩时间越长. 默认是1 gzip_types. text/css text/javascript; # 哪些文件可以被压缩 gzip_disable.

Nginx 限流

- - 鸟窝
电商平台营销时候,经常会碰到的大流量问题,除了做流量分流处理,可能还要做用户黑白名单、信誉分析,进而根据用户ip信誉权重做相应的流量拦截、限制流量. Nginx自身有的请求限制模块 ngx_http_limit_req_module、流量限制模块 ngx_stream_limit_conn_module基于令牌桶算法,可以方便的控制令牌速率,自定义调节限流,实现基本的限流控制.

NGINX的流媒体插件 nginx-rtmp-module

- - 开源软件 - ITeye博客
战斗民族俄罗斯人民开发的一款NGINX的流媒体插件,除了直播发布音视频流之外具备流媒体服务器的常见功能. 基于HTTP的FLV/MP4 VOD点播. HLS (HTTP Live Streaming) M3U8的支持. 基于http的操作(发布、播放、录制). 可以很好的协同现有的流媒体服务器以及播放器一起工作.