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不变
如图:
示例:根据用户浏览器重写访问目录
location / { if ($http_user_agent ~* 'chrome') { rewrite ^(.*)$ /chrome/$1 last; } } location /chrome { root html; index index.html index.htm; }
使用此范例时html下必须有chrome目录,且有保存的uri