一、基础配置语法
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/phone
server {
listen 80;
server_name test.cp.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 test.cp.com;
root /test;
rewrite_log on;
if ($http_user_agent ~* 'android|iphone|ipad') {
rewrite ^/$ http://phone.cp.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;
}
}
}