11、Nginx-rewrite重写

版权声明:原创作品,谢绝转载!否则将追究法律责任。 ————— 作者: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 "网站维护中";
}
posted @ 2022-07-06 10:20  kirin(麒麟)  阅读(57)  评论(0编辑  收藏  举报
Δ