rewrite
用于地址跳转、协议跳转、URL静态化(将动态URL地址显示为静态URL地址的一种技术)。
主要功能是用来重写URL或URL跳转。
sed
设定一个变量,并给这个变量赋予一个值。
if
条件判断语句。
sed与if组合实现域名跳转配置示例1:
server {
listen 80;
server_name url.wenjie.com.zh url.wenjie.com.jp;
location / {
# 判断用户请求的域名是zh还是jp
if ( $http_host ~* "zh") {
set $language zh;
}
if ( $http_host ~* "jp") {
set $language jp;
}
}
# 配置rewrite跳转规则
rewrite ^/$ http://url.wenjie.com/$language/ permanent;
}
上面代码实现的是我们访问url.wenjie.com.zh自动跳转url.wenjie.com/zh/,访问url.wenjie.com.jp自动跳转到url.wenjie.com/jp/。
sed与if组合实现域名跳转配置示例2:
server {
listen 80;
server_name url.wenjie.com;
root /opt;
location / {
index index.html;
# 如果用户请求的uri中a1=3256,那么就通过反向代理代理到10.16.3.5:8080端口
if ($request_uri ~* 'a1=3256') {
proxy_pass 10.16.3.5:8080;
# 为了便于展示结果,我们可以在这里加一个返回值来确认实现成功。
return 200 'ok...';
}
}
}
# 测试命令为:
curl -L HHost: url.wenjie.com http://10.0.0.7?a1=3256
return
用于返回数据、字符串以及url地址等等。
配置示例;
return:主要用来返回数据|返回字符串|返回url地址。
1/如果用户使用 IE 访问 url.oldxu.com 则返回字符串 ( 请更换您的浏览器。 ) chrome [返回数据]
server {
listen 80;
server_name url.oldxu.com;
root /opt;
charset gbk,utf-8;
location / {
index index.html;
default_type text/html;
#判断用户使用的是否是 chrome浏览器,如果是则 返回一段话,如果不是则正常访问。
if ( $http_user_agent ~* "chrome|MSIE" ) {
return 200 'Please change Browser!!!';
}
}
}
2.如果使用IE访问,直接报错 500. [返回状态码]
server {
listen 80;
server_name url.wenjie.com;
root /opt;
charset gbk,utf-8;
location / {
index index.html;
default_type text/html;
#判断用户使用的是否是 chrome浏览器,如果是则 返回一段话,如果不是则正常访问。
if ( $http_user_agent ~* "chrome|MSIE" ) {
return 500;
}
}
}
3.如果使用IE访问,直接跳转至浏览器下载页面。http://www.firefox.com.cn/ [返回一个url地址]
server {
listen 80;
server_name url.wenjie.com;
root /opt;
charset gbk,utf-8;
location / {
index index.html;
default_type text/html;
#判断用户使用的是否是 chrome浏览器,如果是则 返回一段话,如果不是则正常访问。
if ( $http_user_agent ~* "chrome|MSIE" ) {
return 302 http://www.firefox.com.cn;
}
}
}
rewrite语法
rewrite 正则匹配 替换后的结果 [标识]
例:
[root@web01 ~]# cat /etc/nginx/conf.d/url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /code;
location / {
rewrite /1.html /2.html;
rewrite /2.html /3.html last;
}
location /2.html {
rewrite /2.html /a.html;
}
location /3.html {
rewrite /3.html /b.html;
}
}
break
表示停止匹配,只要该条规则匹配成功,后面的匹配规则就不会被匹配。(所有location都不会匹配)
last
表示匹配成功后,不再匹配本location中的其他内容。在匹配成功后,会重新向server发起请求,哪个匹配执行哪个。
permanent
表示永久跳转,状态码是301.
redirect
表示临时跳转,状态码为302.
http–https场景下:
permanent:状态码301,永久跳转。 新跳转的网站有排名,旧网站排名会被清空。
redirect: 状态码302,临时跳转。 旧网站排名无影响,新网站没有排名。
企业案例介绍
- 根据用户浏览器请求头中携带的语言调度到不同的页面。
server {
listen 80;
server_name url.wenje.com;
root /opt;
#判断浏览器语言
if ($http_accept_language ~* "zh|zh-cn" ) {
set $language /zh;
}
if ($http_accept_language ~* "jp|ja" ) {
set $language /jp;
}
#rewrite跳转
rewrite ^/$ $language;
location / {
index index.html;
}
}
- 用户通过手机设备访问 url.wenjie.com,跳转至url.wenjie.com/m
server {
listen 80;
server_name url.wenjie.com;
root /opt;
#判断是否是手机
if ($http_user_agent ~* 'android|iphone|ipad') {
rewrite ^/$ /m last;
}
location / {
index index.html;
}
}
- 用户通过手机设备访问 url.wenjie.com 跳转至 m.wenjie.com
server {
listen 80;
server_name url.wenjie.com;
root /opt;
#判断是否是手机
if ($http_user_agent ~* 'android|iphone|ipad') {
rewrite ^/$ http://m.wenjie.com redirect;
}
location / {
index index.html;
}
}
server {
listen 80;
server_name m.wenjie.com;
root /opt/m;
location / {
index index.html;
}
}
- 用户通过http协议请求,能自动跳转至https协议。
server {
listen 80;
server_name url.oldxu.com;
root /opt;
rewrite ^/$ https://$http_host;
或
return 302 $https://$server_name$request_uri;
}
- 网站在维护过程中,希望用户访问所有网站重定向至一个维护页面。
server {
listen 80;
server_name url.oldxu.com;
root /opt;
#维护状态
rewrite ^(.*)$ /wh.html break;
location / {
index index.html;
}
}
- 当服务器遇到 403 403 502 等错误时,自动转到临时维护的静态页。
server {
listen 80;
server_name url.oldxu.com;
root /opt;
location / {
index index.html;
}
error_page 403 404 502 = @tempdown;
location @tempdown {
rewrite ^(.*)$ /wh.html break;
}
}
--------------https://404.life/ 错误页面模板
[root@web01 error_page]# cat /etc/nginx/conf.d/url.oldxu.com.conf
server {
listen 80;
server_name url.oldxu.com;
root /opt;
location / {
index index.html;
}
#碰到403 404 502 -->tempdown,tempdown内部重定向
error_page 403 404 502 = @tempdown;
location @tempdown {
root /opt/error_page;
rewrite ^(.*)$ /index.html break;
}
}
- 公司网站在停机维护时,指定的IP能够正常访问,其他的IP跳转到维护页。
server {
listen 80;
server_name url.oldxu.com;
root /opt;
#初始一个变量为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;
}
}
或
server {
listen 80;
server_name url.oldxu.com;
root /opt;
location / {
index index.html;
allow 10.0.0.7/32;
deny all;
}
location /error_page {
root /opt;
}
error_page 403 = @temp;
location @temp {
return 302 'http://url.oldxu.com/error_page/index.html';
}
}
- 公司网站后台/admin,只允许公司的出口公网IP可以访问,其他的IP访问全部返回500,或直接跳转至首页。
server {
listen 80;
server_name url.oldxu.com;
root /opt;
location / {
index index.html;
}
location /admin {
index index.html;
#设定一个初始变量,变量名为ip,变量的值为0
set $ip 0;
#判断来源的用户IP是多少,如果是10.0.0.7,则将变量名ip的值重置为1
if ($remote_addr ~ "10.0.0.7") {
set $ip 1;
}
#判断ip变量为0的,直接500拒绝。
if ($ip = 0) {
#return 500;
return 302 'https://www.xuliangwei.com';
}
}
}