Apache和Nginx的Rewrite规则对比

时间:2022-12-26 09:49:48
    1. 一.Apache的rewrite

      1、Rewrite规则简介: 
      Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的
      (httpd.conf)和目录级的(.htaccess) 两种方式。如果要想用到rewrite模块,必须先安装或加
      载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,另一种是编译
      apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。基于服务器级
      的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打
      开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说
      明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则
      virtualhost里没有RewriteEngine on它里面的规则也不会生效。
      基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在
      .htaccess里要声明RewriteEngine on。

       

      2.字符含义介绍:

      Rewrite标志

      R[=code](force redirect) 强制外部重定向

      G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。

      P(force proxy) 强制使用代理转发。

      L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。

      N(next round) 重新从第一条规则开始运行重写过程。

      C(chained with next rule) 与下一条规则关联

      如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过

      T=MIME-type(force MIME type) 强制MIME类型

      NS (used only if no internal sub-request) 只用于不是内部子请求

      NC(no case) 不区分大小写

      QSA(query string append) 追加请求字符串

      NE(no URI escaping of output) 不在输出转义特殊字符

      例如:

      RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zed

      PT(pass through to next handler) 传递给下一个处理

      Rewrite时服务器变量:

      HTTP headers:HTTP_USER_AGENT, HTTP_REFERER, HTTP_COOKIE, HTTP_HOST, HTTP_ACCEPT

      connection & request: REMOTE_ADDR, QUERY_STRING

      server internals: DOCUMENT_ROOT, SERVER_PORT, SERVER_PROTOCOL

      system stuff: TIME_YEAR, TIME_MON, TIME_DAY

      3.实际操作

      在httpd-vhosts.conf中的写法如下:

    1. RewriteRule ^/jiaju/([a-z]+)/des.html /jiaju/index.php?c=jiaju&a=designerList&city=$1

      RewriteRule ^/jiaju/([a-z]+)/des_r([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignPrice=$2

      RewriteRule ^/jiaju/([a-z]+)/des_c([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignStyle=$2

      RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+).html /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2

      RewriteRule ^/jiaju/([a-z]+)/des_r([\d]+)_c([\d]+).html 

      /jiaju/index.php?c=jiaju&a=designerList&city=$1&DesignPrice=$2&DesignStyle=$3

      RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_r([\d]+).html 

      /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3

      RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_c([\d]+).html 

      /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignStyle=$3

      RewriteRule ^/jiaju/([a-z]+)/des_s([\d]+)_r([\d]+)_c([\d]+).html 

      /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3&DesignStyle=$4

      以上rewrite可用一条规则匹配,如下

      RewriteRule  ^/jiaju/([a-z]+)/des(?:_s([\d]*))?(?:_r([\d]))?(?:_c([\d]*))?.html

      /jiaju/index.php?c=jiaju&a=designerList&city=$1&sortResult=$2&DesignPrice=$3&DesignStyle=$4

  1. #装修报价rewrite规则
    RewriteRule ^/jiaju/([a-z]+)/zxbj(?:_r([\d]*))?(?:_s([\d]*))?(?:_f([\d]*))?(?:_a([\d]*))?(?:_p([\d]*))?.html
    /jiaju/index.php?c=jiaju&a=zxbj&city=$1&CaseRoom=$2&CaseStyle=$3&CasePictureType=$4&Area=$5&Price=$6

    上面一条亦可拆分成以下两条规则:

    RewriteRule ^/jiaju/([a-z]+)/zxbj(?:_r([\d]*))?(?:_s([\d]*))?(.*) $4city=$1&CaseRoom=$2&CaseStyle=$3 [C,NC]
    RewriteRule ^(?:_f([\d]*))?(?:_a([\d]*))?(?:_p([\d]*))?.html(.*)
    /jiaju/index.php?c=jiaju&a=zxbj&$4&CasePictureType=$1&Area=$2&Price=$3 [QSA,NC,L]

    可以从以上规则中感受apache的rewrite规则。

    值得注意的是apache的rewrite规则参数若超过十个则得分成两条来写! 而在nginx中是通过重命名的方式实现,具体讲解见下面。

    二.Nginx的rewrite规则:

    Nginx的rewrite重定向相当于apache的RewriteRule,具体讲解如下:

    它可以用在server,location 和IF条件判断块中,例子如下

    server

    {

    #指定监听端口

     listen       80;

    #指定服务器域名

    server_name  mm.test.fang.com;

    #指定能解析的页面

     index index.html index.htm index.php;

    #指定实际的工作代码路径

     root  /opt/lampp/htdocs/www;

     rewrite ^/ http://www.c1gstudio.com/;

     access_log  off;

    }

    location ~* ^/zf_bs/ {

      #rewrite ^/zf_bs/(.*) /zf_bs/$1;
    rewrite ^/([a-z]*)_?(\d*)_?(\d*)/?p?([0-9,]*)t?(\d*)m?(\d*)s?(\d*)h?(\d*)o?(\d*)f?(?P<f>\d*)d?(?P<d>\d*)p?x?(?P<px>\d*)/? /zf/?purpose=%B1%F0%CA%FB&city=$1&district=$2&comarea=$3&price=$4&buildclass=$5&rtype=$6&housetype=$7&room=$8&towards=$9&floor=$f&equipment=$d&orderby=$px&rewrite last;
    }

    这一条rewrite规则在apache中的实现:

    RewriteRule 

    ^/([a-z]*)_?(\d*)_?(\d*)/?p?([0-9,]*)t?(\d*)m?(\d*)s?(\d*)h?(\d*)(.*)/$ $9&&purpose=%B1%F0%CA%FB&city=$1&district=$2&comarea=$3&price=$4&buildclass=$5&rtype=$6&housetype=$7&room=$8 [C,NC]

    RewriteRule

    ^o?(\d*)f?(\d*)d?(\d*)x?(\d*)&&(.*)   /zf/index.php?$5&towards=$1&floor=$2&equipment=$3&orderby=$4&rewrite [QSA,L,NC]

    nginx中若多于十个条件的用重命名的方式表示 ,如f?(?P<f>\d*)  (实际上是一种匹配规则),但在nginx中不支持此法,只能分成两条来写 

    if ($http_user_agent ~ MSIE) {

    rewrite ^(.*)$   /nginx-ie/$1 break;

    }

    关键字符介绍:

    last – 此条规则匹配完后不在向下匹配 ,相当于apache的L;
    break– 中止Rewirte,不在继续匹配;
    redirect – 返回临时重定向的HTTP状态302;
    permanent – 返回永久重定向的HTTP状态301;

    匹配判断的特殊字符:
    ~  为区分大小写匹配;

    !~为区分大小写不匹配;

    ~*为不区分大小写匹配;

    !~为不区分大小写不匹配。

    (nginx更多介绍将“nginx学习篇”)

     

     

     

     

     

Apache和Nginx的Rewrite规则对比的更多相关文章

  1. Nginx的Rewrite规则与实例

    通过Rewrite规则可以实现规范的URL.根据变量来做URL转向及选择配置,用好Rewrite有时起到事半功倍的效果. 语法 Nginx的Rewrite相比Apache的要好理解很多,主要使用指令有 ...

  2. Nginx之Rewrite规则

    IF语句: http://tengine.taobao.org/nginx_docs/cn/docs/http/ngx_http_rewrite_module.html#if 首先申明nginx只有i ...

  3. Nginx 设置rewrite规则是遇到的一个&lbrace;&rcub;大括号引发的报错问题

    一个群友提到: 用nginx image_filter模块裁图,用!拼宽高能够实现,现在想用参数传宽高总是报错,配置如下:   location ~ ^/images/.* {     if ( $q ...

  4. Nginx 之 Rewrite 规则

    write 规则介绍 Rewite 规则作用 Rewrite规则可以实现对url的重写,以及重定向 作用场景: URL访问跳转,支持开发设计,如页面跳转,兼容性支持,展示效果等 SEO优化 维护:后台 ...

  5. nginx 带&quest; rewrite 规则

    由于需要重定向 url ,nginx需要rewrite .参考文献 http://huangqiqing123.iteye.com/blog/2083434 需求:将http://10.106.1.3 ...

  6. nginx 重定向 rewrite 规则

    1.rewrite配置 server { listen 80 default_server; server_name jeson.t.imooc.io; access_log /var/log/ngi ...

  7. 修改Nginx 伪静态Rewrite规则 安装Chevereto

    Chevereto 是目前最为强大的 PHP 图床系统,通过它可部署多用户公开或私有的图片存储服务,现在 Chevereto 出了免费的版本,小伙伴可以围观一下. https://github.com ...

  8. nginx的rewrite规则

    301跳转: server { listen 80; server_name www.xiaofan.com; return 301 https://$server_name$request_uri; ...

  9. Nginx与Apache的Rewrite规则的区别

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

随机推荐

  1. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  2. 118、通过solid来定义不同边框的颜色,可以只定义一个边框的颜色

    以下是设置按钮的右边框和底边框颜色为红色,边框大小为3dp,如下图: 在drawable新建一个 buttonstyle.xml的文件,内容如下: <?xml version="1.0 ...

  3. Click模块化路由器

    [概述] Click是一种基于软件控制的模块化路由器.其架构可以大致视为一系列数据包处理模块(称为elements)组成的.一个Click路由器可以看成一张由elements作为顶点,数据包传递路径作 ...

  4. OAF 中对文字实现html效果及对超级长文本实现默认换行,对只读的messageTextInput中的内容自动换行

    今天遇到一个需求,客户注册页面客户化了一个超级长的注册须知,内容很多.但是样式相对又要做起来好看点. 注册须知的内容使用多个message拼接而成. 老大说rawText支持html样式,于是我想到了 ...

  5. centos5&period;5上apache快速安装H264流媒体支持MP4-H264边下边播

    2013年的某一天,客户反馈北京同事做的广告视频下载速度好慢,几MB的视频在手机上要下载接近一分钟才能开始播放. 我分析后发现两点:1)托管的服务器没支持流媒体:2)广告视频MP4并非流媒体格式. 对 ...

  6. ASP&period;NET抓取网页内容

    原文:ASP.NET抓取网页内容 一.ASP.NET 使用HttpWebRequest抓取网页内容 这种方式抓取某些页面会失败 不过,有时候我们会发现,这个程序在抓取某些页面时,是获不到所需的内容的, ...

  7. seajs源码阅读

    乘着周日有点时间,阅读一下玉伯大神的源码. seajs的源码写得真的很好,很是佩服,工整美观不愧是大神,造福百姓. 说起seajs不得不说,AMD和CMD的区别.  CMD 推崇依赖就近,AMD 推崇 ...

  8. Odoo 菜单美化的扩展模块

    详见: http://www.oejia.net/blog/2018/07/07/oejia_menu_about.html Odoo 菜单美化主题,odoo默认的菜单算是简洁好用的,如果您觉得还少了 ...

  9. mi家前端面经

    已经好久没想写面经了……菜鸟面到生无可恋. 1.用CSS实现下面圆形 答案: <!DOCTYPE html> <html> <head> <style typ ...

  10. Parameter &&num;39&semi;name&&num;39&semi; not found&period; Available parameters are &lbrack;arg1&comma; arg0&comma; param1&comma; param2&rsqb;

    解决方法: <select id="selectIf" resultType="student"> SELECT id,name,age,score ...