设为首页 收藏本站
查看: 486|回复: 0

[经验分享] nginx rewrite学习笔记

[复制链接]

尚未签到

发表于 2016-12-25 10:52:56 | 显示全部楼层 |阅读模式
  一、什么是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相关指令有ifrewritesetreturn等。
    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;
    }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-319125-1-1.html 上篇帖子: 让Apache 和nginx支持跨域访问 下篇帖子: lighttpd,nginx,apache的性能负载比较
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表