Py008-10-08url重写

url重写

  • rewrite模块(ngx_http_rewrite_module)
  • Rewrite功能是Nginx服务器提供的⼀个重要功能。⼏乎是所有的web产品必备技能,⽤于实现URL重写。URL重写是⾮常有用的功能,比如它可以在 我们在改变网站结构后,不需要客户端修改原来的书签,也不需要其他⽹站修改对我们⽹站的友情链接,还可以在一定程度上提⾼网站的安全性,能够让我们的网站显得更专业。
  • Nginx服务器Rewrite功能的实现是依赖于PCRE(Perl Compatible Regular Expression。Perl兼容的正则表达式)的支持,所以在编译安装Nginx之前, 需要安装PCRE库。

www.360buy.com 就是京东的url重写

应用场景

  • 域名变更(京东)
  • 用户跳转(从某个链接跳到另一个链接)
  • 伪静态场景(便于CDN缓存动态页面数据)

重写原理

你找我,我不给你数据,我告诉你哪里有数据

张三找李四借钱,李四说王五有钱去找王五

URL rewrite实现

url模块指令

1
2
3
4
5
1) set 设置变量
2) if 负责判断
3) return 返回返回值或 url
4) break 终止后续的rewtite规则
5) rewrite 重定向URL

set指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# set指令 ⾃自定义变量量 
# Syntax:语法
set $variable value;
Default:

# Context:作用域 可以放在 server/location/if里
server, location, if


# 将http://www.baidu.com 重写为 http://www.baidu.com/xxx

location / {
set $name hjx;
rewrite ^(.*)$ http://www.baidu.com/$name;
}

if指令

  • nginx有一些内置变量 自行百度
  • 匹配规则
    1
    2
    3
    4
    5
    6
    7
    8
    # 模糊匹配
    ~ 匹配
    !~ 不匹配
    ~* 匹配而且不区分大小写

    # 精确匹配
    =
    !=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if指令 负责判断 Syntax:
if (condition) { ... } Default:


Context: server, location


location / {
root html;
index index.html index.htm;
# 日志里 $http_user_agent是用来代表客户端访问的浏览器(它其实是nginx的内置变量)
# 这里针对 google访问 返回403
if ($http_user_agent ~* 'Chrome') {

return 403;
#return http://www.jd.com;
}
}

return指令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
return 指令 定义返回数据 Syntax: return code [text]; return code URL;
return URL;
Default: —
Context: server, location, if


----------------------------- 如果chrome浏览器访问就返回 京东
location / {
root html;
index index.html index.htm;
if ($http_user_agent ~* 'Chrome') {
# return 403;
# return指令 既可以返回状态码 还可以返回url
return http://www.jd.com; }
}

break指令

1
2
3
4
5
6
7
8
9
10
# 本来是匹配chrome浏览器访问就返回 京东 但是有 break 就导致提前结束 后续的url重写就失效了
location / {
root html;
index index.html index.htm;
if ($http_user_agent ~* 'Chrome') {
break;
# return 403;
# return指令 既可以返回状态码 还可以返回url
return http://www.jd.com; }
}

rewrite 语法

1
2
3
4
5
6
7
8
rewrite  <regex>  <replacement> [flag];
关键字 正则 替代内容 flag标记

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

案例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
域名跳转
www.ayitula.com 重写为 www.jd.com

server {
listen 80;
# 修改本地host 里添加www.ayitula.com的解析
server_name www.ayitula.com;
location / {
# 临时重定向301
rewrite ^/$ http://www.jd.com permanent ;
# 永久重定向302
rewrite ^/$ http://www.jd.com redirect ;
# 碰到break不往后处理了 直接返回 www.jd.com 也是302
rewrite ^/$ http://www.jd.com break ;
}
}

注意:
重定向就是将⽹页自动转向重定向
# 对新域名推广
301永久性重定向:新网址完全继承旧网址,旧网址的排名等完全清零
301重定向是⽹页更改地址后对搜索引擎友好的最好⽅法,只要不是暂时搬移的情况,都建议使用301来做转址。

# 对老域名推广
302临时性重定向:对旧⽹址没有影响,但新网址不会有排名
搜索引擎会抓取新的内容而保留旧的⽹址

last指令

1
如果是chrome浏览器器 就将 http://192.168.10.42/$URI 重写为 http://192.168.10.42/chrome/$URI
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
如果是chrome浏览器器 就将 http://192.168.10.42/$URI 重写为 http://192.168.10.42/chrome/$URI
location / {
if ($http_user_agent ~* 'chrome'){
rewrite ^(.*)$ /chrome/$1 last;
}
# 对重写为 http://192.168.10.42/chrome/$URI 匹配
location /chrome {
root html ;
index index.html;
}
}

根据⽤用户浏览器器重写访问⽬目录
#^ 以什什么开头 ^a
#$ 以什什么结尾 c$
#. 除了了回⻋车以外的任意⼀一个字符
#* 前⾯面的字符可以出现多次或者不不出现 #更更多内容看正则表达式 re