nginx rewrite基础配置

原文链接:https://www.cpweb.top/670

一、基础配置语法

Rewirte主要的功能就是实现URL的跳转

(1)set设定变量

为指定变量设置一个值。该值可以包含文本、变量及其组合。

Syntax:	set $variable value;
Default:	—
Context:	server, location, if

(2)if判断

Syntax:	if (condition) { ... }
Default:	—
Context:	server, location

可判断的条件:
   ▪ 变量名字。如果变量的值为空字符串或"0",则返回false。
   ▪ 使用"=""!="运算符将变量与字符串进行比较。
   ▪ 使用"~"(区分大小写的匹配)和"~*"(不区分大小写的匹配)运算符将变量或者字符串与正则表达式进行匹配。
      正则表达式可以包含捕获,这些捕获可用于以后在$1..$9变量中调用。
      也可以使用负运算符"!~""!~*",即取反。
      如果正则表达式包含"}"":"字符,则整个表达式应用单引号或双引号引起来。
   ▪ 使用"-f""! -f"运算符检查文件是否存在1。
   ▪ 使用"-d""!-d"运算符检查目录是否存在。
   ▪ 使用"-e""!-e"运算符检查文件、目录或符号链接是否存在。
   ▪ 使用"-x""!-x"算符检查可执行文件。

示例:

# 判断$http_user_agent(即客户端浏览器相关信息)的值是否包含MSIE。
if ($http_user_agent ~ MSIE) {
    rewrite ^(.*)$ /msie/$1 break;
}

# 双引号中括号内的内容即捕获的内容,一个括号代表一个捕获,后面可以按顺序使用$1..$9变量进行调用。
# 判断$http_cookie(即客户端cookie信息)id是否符合后面正则表达式规律,符合则设定一个$id变量,并将$1的值赋值给它。
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {  
    set $id $1;
}

# 判断$request_method(即http请求方法)的值是否等于POST,如果等于则返回405状态码。
if ($request_method = POST) {
    return 405;
}

# 判断$slow(自行设置的变量)的值是否不为空或者不等于0,成立则限制向客户端传输数据的速率为10km每秒。
if ($slow) {
    limit_rate 10k;
}

# 判断$invalid_referer(使用valid_referers自行设置的变量)的值是否不为空或者不等于0,成立则返回403状态码。
if ($invalid_referer) {
    return 403;
}

(3)return返回数据

停止处理并将指定的代码返回给客户端,code代表状态码。

Syntax:	return code [text];
        return code URL;
        return URL;
Default:	—
Context:	server, location, if

示例:

server {
	listen 80;
	server_name localhost;
	root /test;
	index index.html;
  
    location /test1 {
		default_type text/html;
		# 判断用户使用的是否是Chrome浏览器,如果是则返回一段话。
		if ( $http_user_agent ~* "Chrome" ) {
			return 200 'Welcome to chrome browser';
		}
	}
	location /test2 {
		# 判断用户使用的是否是Chrome浏览器,如果是则返回500。
		if ( $http_user_agent ~* "Chrome" ) {
			return 500;
		}
	}
	location /test3 {
		# 判断用户使用的是否是Chrome浏览器,如果是则跳转到baidu.com。
		if ( $http_user_agent ~* "Chrome" ) {
			return 302 http://www.baidu.com;
	    }
	}
}

  注意:如果写成这样"return www.baidu.com;“会报错,要么写成"return http://www.baidu.com;”,要么写成"return 302 www.baidu.com;"。

二、rewrite

如果指定的正则表达式与请求URI匹配,则URI将按照替换字符串中的指定的值进行更改。

Syntax:	rewrite regex replacement [flag];
Default:	—
Context:	server, location, if

flag标记:

(1)break和last

last:如果在location内部,遇到last,则本location内后续指令都不再执行,会跳出本location,重新在server中寻找匹配的location。

break:如果在location内部遇到了break,则本location内以及后面的所有的location内的指令都不在执行。

示例:

server {
    listen 80;
    server_name localhost;
    root /test;

    location / {  
        rewrite /1.html /2.html;
        
        # 为last,则跳出本location,匹配到location /2.html,结果为a.html。
        #rewrite /1.html /2.html last;
        # 为break,则跳出本location,后续一切指令不再执行,结果为2.html。
        #rewrite /1.html /2.html break;

        rewrite /2.html /3.html;
    }

    location /2.html {
        rewrite /2.html /a.html;
    }

    location /3.html {
        rewrite /3.html /b.html;
    }
}

(2)redirect和permanent

redirect:给客户端返回带有302状态码的临时重定向,如果replacement(即替换的字符串)的值不是以"http://"和"https://"开头的情况下,可以使用这个临时重定向。关闭nginx,就不会跳转了。

permanent:给客户端返回带有301状态码的永久重定向。关闭nginx,仍然可以跳转,除非清除浏览器缓存。

注意:以上两个参数对网站排名有影响:使用redirect,旧网站排名无影响,新网站没有排名;使用permanent,新跳转的网站有排名,而旧网站排名会被清空。

三、实例

(1)根据用户浏览器请求头中携带的语言调度到不同的页面

server {
    listen 80;
    server_name localhost;
    root /test;

    if ($http_accept_language ~* "zh|zh-cn" ) {
        set $language zh;
    }
    if ($http_accept_language ~* "en|en-us" ) {
        set $language en;
    }

    rewrite_log on;
    rewrite ^/$ /$language last;
    #rewrite ^([^\.]*)$ /$language last;

    location / {
        index  index.html;
    }
}

(2)用户通过手机设备访问test.cp.com,跳转至test.cp.com/m

server {
    listen 80;
    server_name cp.test.com;
    root /test;
    rewrite_log on;

    if ($http_user_agent ~* 'android|iphone|ipad') {
        rewrite ^/$ /phone last;
    }
    
    location / {
        index  index.html;
    }
}

(3)用户通过手机设备访问test.cp.com,跳转至phone.cp.com

server {
    listen 80;
    server_name cp.test.com;
    root /test;
    rewrite_log on;

    if ($http_user_agent ~* 'android|iphone|ipad') {
        rewrite ^/$ http://m.oldxu.com redirect;
    }
    
    location / {
        index  index.html;
    }
}

(4)用户访问网站时将http协议强制跳转到https

server {
    listen 80;
    server_name test.cp.com;
    rewrite_log on;
    rewrite ^(.*)$ https://$server_name$1 redirect;
    #return 302 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name test.cp.com;
    root /test;

    ssl_certificate ssl_key/server.crt;
    ssl_certificate_key ssl_key/server.key;

    location / {
        index index.html;
    }
}

(5)网站在维护过程中,希望用户的访问都重定向至一个维护页面。

server {
    listen 80;
    server_name test.cp.com;
    root /test;

    rewrite_log on;
    rewrite ^(.*)$ /wh.html break;

    location / {
        index index.html;
    }
}

(6)当服务器遇到 403 404 502 等状态码时,自动跳转到维护页面。

server {
    listen 80;
    server_name test.cp.com;
    root /test;
    rewrite_log on;
    
	location / {
		index index.html;
	}
		
	error_page 403 404 502 = @error;
	location @error {
		rewrite ^(.*)$ /wh.html break;
	}
}

(7)网站在停机维护时,除指定的IP能够正常访问,其它的IP全部跳转到维护页面。

server {
    listen 80;
    server_name test.cp.com;
    root /test;
    rewrite_log on;
    
	#设定一个变量$ip初始值为0。
	set $ip 0;
	#判断来源IP是否在允许列表里,如果在则设定$ip变量为1。
	if ($remote_addr ~ "10.0.0.1|10.0.0.2") {
		set $ip 1;
	}
	#判断$ip变量是否等于0,如果等于直接跳转到维护页面。
	if ($ip = 0) {
		rewrite ^(.*)$ /wh.html  break;
	}

	location / {
		index index.html;
	}
}

  当然这里只是使用rewrite方式演示,实际使用访问限制模块更加方便高效。

server {
    listen 80;
    server_name test.cp.com;
    root /test;
    rewrite_log on;

	location / {
		index index.html;
		allow 10.0.0.1;
		allow 10.0.0.2;		
		deny all;
	}
	
	#访问受限会返回403状态码
    error_page 403 = @error;
	location @error {
		rewrite ^(.*)$ /wh.html break;
}

(8)网站后台/admin,只允许10.0.0.1访问,其他的IP访问直接强制跳转至首页。

server {
    listen 80;
    server_name test.cp.com;
    root /test;
    rewrite_log on;

	location / {
		index index.html;
	}

	location /admin {
		index index.html;

	    #设定一个变量$ip初始值为0。
		set $ip 0;
	    #判断来源IP是否在允许列表里,如果在则设定$ip变量为1。
		if ($remote_addr ~ "10.0.0.1") {
			set $ip 1;
		}
	    #判断$ip变量是否等于0,如果等于直接跳转到维护页面。
		if ($ip = 0) {
			return 302 http://$server_name;
		}
	}
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值