版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者:kirin
1.什么是rewrite
Rewrite主要实现url地址重写, 以及地址重定向,就是将用户请求web服 务器的地址重新定向到其他URL的过程
2.rewrite应用场景
1.地址跳转: www.360buy.com --->www.jd.com
2.协议跳转: http://oldboy.com --->https://oldboy.com
3.伪静态: 动态url---->静态url 防止url暴露网站路径(目录结构)
blog.oldboy.com/index.php?product=linux&page=01
rewrite> blog.oldboy.com/linux/page01
4.其他跳转需求:seo 需求
3.rewrite常用模块
1.if模块
语法
Syntax: |
**if** (*condition*) { ... } |
Default: |
— |
Context: |
server , location |
if () {
满足条件后执行指令
}
#主要应用场景 配合各种nginx变量(内置/手动创建) 判断.....
if 常用的条件及格式
条件 |
解释 |
取反 |
= |
精确匹配,一模一样 等于 |
!= |
~ |
过滤,支持正则,区分大小写 |
!~ |
~* |
过滤,支持正则,不区分大小写 |
!~* |
-f |
文件存在 |
!-f |
-d |
目录存在 |
!-d |
-e |
文件或目录存在 |
!-e |
-x |
文件有执行权限 |
!-x |
Nginx常用变量
nginx内置变量 |
|
$http_user_agent |
客户端浏览器 |
$request_uri |
用户请求的uri(包含参数) |
$host |
用户访问Host内 |
$remote_addr |
用户ip地址 |
$args |
只取出请求行里面的参数部分 |
应用案例:
###案例01 用户的客户端如果是 包含spider 或者bot 的(不区分大小 写),则显示403(防爬虫)
[root@web01 /etc/nginx/conf.d]# cat rewrite.oldboy.com.conf
server {
listen 80;
server_name rewrite.oldboy.com;
default_type text/html; ###不加这个参数浏览器默认解析不了会自动下载。
root /code/rewrite;
index index.html;
if ( $http_uer_agent ~* spider|bot" ) {
return 200 "do not user spider";
}
}
命令行测试
[root@web01 /etc/nginx/conf.d]# curl -A baiduspider -H Host:rewrite.oldboy.com 10.0.0.7
do not user spider
###案例02 : 过滤Nginx请求中包含a1=3526的http请求到10.16.3.5的8080 端口处理。
URL: re.oldboy.com?a1=3526&a2=666&a3=9999
if ( $request_uri ~* 'a1=3526' ) { ###一般会要求a1等于4位数或更多位数\d代表数字。
proxy_pass http://10.16.3.5:8080;
}
2.Set模块
语法
Syntax: |
**set** *$variable* *value*; |
Default: |
— |
Context: |
server , location , if |
应用案例
#案例03用户请求rewrite.kirin7.com.cn访问 /code/rewrite/cn/index.html kirin7.cn 用户请求 rewrite.kirin7.com.jp访问 /code/rewrite/jp/index.html kirin7.jp
[root@web01 /etc/nginx/conf.d]# cat rewrite.oldboy.com.conf
server {
listen 80;
server_name rewrite.kirin7.com rewrite.kirin7.com.cn rewrite.kirin7.com.jp;
charset utf8;
root /code/rewrite;
index index.html;
default_type text/html;
if ($host ~ '\.cn$' ) {
set $lang "cn";
}
if ($host ~ '\.jp$' ) {
set $lang "jp";
if ($request_uri ~ '/' ) {
rewrite ^/(.*)$ /cn/$1;
}
rewrite ^/$ http://rewrite.kirin7.com/$lang/ redirect;
}
3.return模块
语法
Syntax: |
**return** *code* [*text*]; **return** *code* *URL*; **return** *URL*; |
Default: |
— |
Context: |
server , location , if |
应用案例
#需求:如果用访问rewrite.kirin7.com 则返回值字 符串. 请更换浏览器,使用Edge/Chrome/Firefox
if ($http_user_agent ~* "MSIE" ) {
return 200 "请更换浏览器,使用Edge/Chrome/Firefox”
}
4.rewrite 跳转功能
语法
Syntax: |
**rewrite** *regex* *replacement* [*flag*]; |
Default: |
— |
Context: |
server , location , if |
rewrite flag标记
break |
跳转完成后,停止匹配其他任何规则,直接返回结果 |
last |
调整完成后,重新使用新的uri继续向下匹配 |
redirect |
302 临时重定向, 临时不 会一直生效(用于http转https) |
permanent |
301 用户跳转, 永久生效 |
4.Rewrite生产环境案例
##需求1: 根据用户浏览器请求头中携带的语言调度到不同的页面
通过nginx 匹配 不同语言
[root@web01 /etc/nginx/conf.d]# cat url.kirin7.org.conf
server {
listen 80;
server_name url.kirin7.org;
root /code/url;
if ($http_accept_language ~ "zh-CN|zh" ) {
set $language "zh";
}
if ($http_accept_language ~ "en" ) {
set $language "en";
}
rewrite ^/$ /$language/ redirect;
}
##需求2: 用户通过手机设备访问url.kirin7.com 跳转至 m.kirin7.org
if ( $http_user_agent ~* "android|ios" ) {
#rewrite实现
rewrite ^/(.*)$ http://m.kirin7.org/$1 redirect;
#return实现
return 302 http://m.kirin7.org/$request_uri ;
}
##需求3: 用户通过http协议请求,能自动跳转至https协议
#规则 rewrite方式
rewrite ^/(.*)$ https://url.kirin7.org/$1 redirect;
rewrite ^/(.*)$ https://$http_host/$1 redirect;
#规则 return方式
return 302 https://$http_host/$request_uri ;
##需求4: 网站维护过程中,希望用户访问所有网站重定向至一个维护页面
在server层定义跳转至维护页面
rewrite ^(.*)$ http://baidu.com;
##需求5: 公司网站在停机维护时,指定的ip能够正常访问,其他的ip跳转 到维护页
##简单粗暴
charset utf8;
default_type text/html;
if ( $remote_addr != '10.0.0.1' ) {
return 200 "网站维护中";
}
##专业
set $ip 0;##定义变量ip为0
if ( $remote_addr = '10.0.0.1' ) {
set $ip 1;###如果ip为10.0.0.1则ip为1
}
if ( $ip = 0 ) {
return 200 "网站维护中";
}