11.Nginx的rewrite重写
孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。
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 |
满足条件后执行指令
}
#主要应用场景 配合各种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.sfy.com.cn访问 /code/rewrite/cn/index.html sfy.cn 用户请求 rewrite.sfy.com.jp访问 /code/rewrite/jp/index.html sfy.jp
[root@web01 /etc/nginx/conf.d]# cat rewrite.oldboy.com.conf
server {
listen 80;
server_name rewrite.sfy.com rewrite.sfy.com.cn rewrite.sfy.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.sfy.com/$lang/ redirect;
}
3.return模块
语法
Syntax: | return code [text]; return code URL; return URL; |
---|---|
Default: | — |
Context: | server , location , if |
应用案例
#需求:如果用访问rewrite.sfy.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.sfy.org.conf
server {
listen 80;
server_name url.sfy.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.sfy.com 跳转至 m.sfy.org
if ( $http_user_agent ~* "android|ios" ) {
#rewrite实现
rewrite ^/(.*)$ http://m.sfy.org/$1 redirect;
#return实现
return 302 http://m.sfy.org/$request_uri ;
}
##需求3: 用户通过http协议请求,能自动跳转至https协议
#规则 rewrite方式
rewrite ^/(.*)$ https://url.sfy.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 "网站维护中";
}
未经允许不得转载:孙某某的运维之路 » 11.Nginx的rewrite重写
评论已关闭