URL重写

在nginx中进行url重写配置会用到rewrite模块(ngx_http_rewrite_module)

rewrite功能时nginx提供的重写功能。几乎所有web产品必备技能,用于实现url重写。url重写时非常有用的功能,比如它可以在我们改变网站结构后,不需要客户端修改原书签,也不需要其他网站修改对我们网站的友情链接,还可以在一定成都上提高网站安全性,能够让我们的网站显得更专业

nginx服务器rewrite功能的实现时依赖于pcre(perl conmpatible regular expression,perl兼容的正则表达式)的支持。所以在编译安装nginx之前,需要安装pcre库

应用场景

  • 域名变更

  • 用户跳转(从一个链接到另一个链接)

  • 伪静态场景(便于CDN缓存动态页面数据)

URL重写原理

客户端访问某个域名,服务器返回一个新的地址给客户端,客户端使用返回的新的域名进行访问

URL模块语法

  • set       设置变量

  • if          负责语句中的判断

  • return  返回返回值或URL

  • break   终止后续的rewrite规则

  • rewrite 重定向URL

rewrite规则相关指令

set指令 

自定义变量

语法:

set $variable value;

Default:

-

Context:

server,location,if

age:www.a.com:81/a重写成www.a.com:81

http {
    include       mime.types;
    default_type  application/octet-stream;
    server_tokens  off;   
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       81;
        server_name  www.a.com;
        charset utf-8;
        location /a {
            set $name hello.html;
            rewrite ^(.*)$ http://www.a.com:81/$name;
        }
    }
}

注意清理缓存

if指令 

负责判断

if (condition) {...}

Default:

-

Context:

server,location

示例:拒绝谷歌浏览器访问,返回403

这里使用到了不区分大小写的匹配~*

其他匹配方式:

  • ~ 匹配

  • !~ 模糊不匹配

  • =   精确匹配

  • !=  精确不匹配


    server {
        listen       81;
        server_name  www.a.com;
        charset utf-8;
        location / {
            #set $name hello.html;
            #rewrite ^(.*)$ http://www.a.com:81/$name;
            root html;
            index index.html index.htm hello.html;
            if ($http_user_agent ~* 'Chrome'){
                return 403;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
     }
   }

return指令  

定义返回数据

语法:return code [text];

return code URL;

return URL;

Default: -

Context: server,location,if

示例延用上方代码,return一个可以访问的域名

break指令  

停止执行当前虚拟主机的后续rewrite指令集

语法:break;

Default: -

Context:server,location,if

示例:如果使用谷歌浏览器访问,终止403响应码返回

        location / {
            #set $name hello.html;
            #rewrite ^(.*)$ http://www.a.com:81/$name;
            root html;
            index index.html index.htm hello.html;
            if ($http_user_agent ~* 'Chrome'){
                  break;
                return 403;
        }

rewrite指令

语法:rewrite <regex> <replacement> [flag];

rewrite<regex><replacement>[flag]
关键字正则替代内容flag标记

flag:

last匹配成功后,继续详细匹配新的location URL规则
break匹配完成后即终止,不再匹配后面的任何规则
redirect返回302临时重定向,浏览器地址会显示跳转后的URL地址
permanent返回301永久重定向没浏览器地址栏会显示跳转后的URL地址

permanent示例:

        location / {
            rewrite ^/$ http://www.jd.com permanent;
        }

使用浏览器访问web打开开发者工具,跳转到jd且network中的响应码为301

将permanent替换为redirect则会调整为临时重定向
注意:

重定向就是将网页自动转向重定向

  • 301永久重定向:新网址完全继承旧网址,但网址的排名等完全清零

    • 301重定向是网页更改地址后对搜索引擎友好的最好方法,只要不是暂时搬移的情况,建议使用301来做转址

  • 302临时性重定向:对旧网址没有影响,但新网址不会有排名

    • 搜索引擎会抓取新的内容而保留旧的网址

break

到此结束不匹配后边规则,将break前的web发送给用户

last

url重写后,马上发起一个新的请求,再次进入server块,重试location匹配,超过10次匹配不到返回500错误,地址栏url不变

如图:

Nginx学习笔记-URL重写_URL

示例:根据用户浏览器重写访问目录

        location / {
            if ($http_user_agent ~* 'chrome') {
                rewrite ^(.*)$ /chrome/$1 last;
            }
        }
        location /chrome {
            root html;
            index  index.html index.htm;
        }

使用此范例时html下必须有chrome目录,且有保存的uri

Nginx学习笔记-URL重写_Nginx_02