目录
一.rewrite跳转实现
- Nginx实现跳转通过ngx_http_rewrite_module模块
- 支持URL重写、支持if条件判断,但是不支持else
- 跳转时,循环最多可以执行10次,超过后nginx将返回500错误
注:http状态码,100 Continue,200 OK(请求成功),300 Multiple Choices (重定向),400(请求错误)Bad Request (语义有误),403 Forbidden (权限不足),404 Not Found (请求失败),5 、6开头服务器错误
- rewrite使用Nginx全局变量或自己设置的变量,结合正则表达式和标志位实现URL重写以及重定向,prce语言支持,重写模块set指令
二.rewrite实用场景
- 使用rewrite进行匹配跳转
- 使用if匹配全局变量后跳转
- 使用location匹配在跳转
- rewrite模块放在server{},if{},location{}段中
注:rewrite不能放在http协议段中
- 对于域名或者参数字符串:使用if全局变量匹配;使用proxy_pass反向代理
三.Nginx正则表达式
字符 | 说明 |
^ | 匹配输入字符串的起始位置 |
$ | 匹配输入字符串的结束位置 |
* | 匹配前面的字符零次或者多次 |
+ | 匹配前面的字符一次或者多次 |
? | 匹配前面的字符零次或者一次 |
. | 匹配除了\n之外的任何单个字符。使用诸如“[.\n]”之类的模式,可以匹配包括\n在内的任何字符 |
\ | 将后面接着的字符标记为一个特殊字符或一个原义字符或者一个向后引用 |
\d | 匹配纯数字 |
{n} | 重复n次 |
{n,m} | 重复n次到m次 |
[c] | 匹配单个字符c |
[a-z] | 匹配a-z小写字母的任意一个 |
[a-zA-Z] | 匹配a-z小写字母或者A-Z大写字母的任意一个 |
四.rewrite命令
- rewrite语法
rewrite <regex> <replacement> [flag];
- flag标记说明
标记 | 说明 |
last | 相当于Apache的【L】标记,表示完成rewrite |
break | 本条规则匹配完成即终止,不再匹配后面的任何规则 |
redirect | 返回302临时重定向,浏览器地址会显示跳转后URL地址,爬虫不会更新url |
permanent | 返回301永久重定向,浏览器地址栏会显示跳转后的url地址,爬虫更新url |
注:URL:在WWW上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是WWW的统一资源定位标志,就是指网络地址。
爬虫:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本
- last和break的比较
last | break | |
使用场景 | 一般写server和if中 | 一般使用在location中 |
URL | 不终止重写后的url匹配 | 终止重写后的url匹配 |
五.location
- location的分类
location=patt {} | {精准匹配} |
location patt {} | {一般匹配} |
location ~ patt {} | {正则匹配} |
- 正则匹配的常用表达式
标记 | 说明 |
~ | 执行一个正则匹配,区分大小写 |
~* | 执行一个正则匹配,不区分大小写 |
!~ | 执行一个正则匹配,区分大小写不匹配 |
!~* | 执行一个正则匹配,不区分大小写不匹配 |
^~ | 普通字符匹配;使用前缀匹配。如果匹配成功,则不再匹配其他location |
= | 普通字符的精确匹配。也就是完全匹配 |
@ | 定义一个命名的location,使用在内部定向时 |
- location的优先级
- 相同类型的表达式,字符串长的会优先匹配,下列按优先级排列,优先级从小到大
= 类型 |
^~ 类型表达式 |
正则表达式 (~和~*)类型 |
常规字符串匹配类型,按前缀匹配 |
通用匹配(/),如果没有其他匹配,任何请求都会匹配到 |
- location优先级规则
- 匹配某个具体文件
(location = 完整路径)> (location ^~ 完整路径) > (location ~* 完整路径 ) > (location ~ 完整路径) > (location 完整路径) > (location /)
- 用目录做匹配访问某个文件
(location = 目录)> (location ^~ 目录/) > (location ~ 目录) >(location ~* 目录) > (location 目录) > (location /)
- location的优先级示例
location = / { [ configuration A ] } | 精确匹配/,主机名后面不能带任何字符串 |
location / { [ configuration B ] } | 所有的地址都以/开头,这条规则匹配到所有请求,但正则和最长字符串会优先匹配 |
location /documents/ { [ configuration C ] } | 匹配任何以/documents/开头的地址,当后面的正则表达式没有匹配到时,才起作用 |
location /documents/abc { [ configuration D ] } | 匹配任何以/documents/abc开头的地址,当后面的正则表达式没有匹配到时,才起作用 |
location ^~ /images/ { [ configuration E ]} | 以/imahes/开头的地址,匹配符合后,停止往下匹配 |
location ~* \.(gif|jpg|swf)$ { [ configuration F ] } | 匹配所有以jpg、gif、swf结尾的请求,/images/下的图片会被[configuration E]处理,因为 ^~的优先级更高 |
location /images/abc { [ configuration G ] } | 最长字符匹配到 /images/abc,优先级最低 |
location ~ /images/abc { [ configuration H ] ] | 以/images/abc开头的,优先级次之 |
location /images/abc/1.html { [ configuration I ] } | 如果和正则~ /images/abc/1.html相比,正则优先级更高 |
六.rewrite与location比较
相同点
- 都能实现跳转
不同点
- rewrite是在同一域名内更改获取资源的路径
- location是对一类路径做控制访问或者反向代理,还可以proxy_pass到其他机器
rewrite会写在location里,执行顺序
- 执行server块里面的rewrite指令
- 执行location匹配
- 执行选定的location中的rewrite指令
七.基于域名跳转
源主机 | 测试机 |
IP地址:192.168.43.229 | IP地址:192.168.43.221 |
旧域名:www.kgc.com | |
新的域名:www.yun.com |
- 实验场景:公司有旧域名 www.kgc.com,因为有业务变更,使用新的域名 www.yun.com
- 实验要求;不废除旧域名,从旧域名跳转到新的域名,保持参数不变
- 首先手工编译安装Nginx
yum install vsftpd -y //安装ftp服务
systemctl start vsftpd //开启ftp服务
#使用wget工具从官网上下载nginx压缩包
wget http://nginx.org/download/nginx-1.12.6.tar.gz
#解压
tar zxvf nginx-1.12.2.tar.gz -C /opt
#安装环境包
yum install gcc gcc-c++ pcre* zlib-devel make -y
#创建用户,不建立宿主文件,且不能再shell上登录
useradd -M -s /sbin/nologin nginx
#配置,安装且编译
cd /opt/nginx-1.12.2/
./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module
#nigix运行的用户和组都为nginx
#启用http_stub_status_module模块以支持状态统计,便于查看服务器的连接信息
make && make install
#为主程序nginx创建软链接
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
#关闭防火墙
systemctl stop firewalld
setenforce 0
#优化服务控制,service工具
vim /etc/init.d/nginx
#!/bin/bash
# chkconfig: -99 20
# description: Nginx Service Control Script
#nginx主程序
PROG="/usr/local/nginx/sbin/nginx"
#nginx的PID号
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
exit 1
esac
exit 0
#添加执行权限
chmod +x /etc/init.d/nginx
#修改主页面
vim /usr/local/nginx/html/index.html
<img height=200px src="1.jpg"/>
#修改主配置文件
vim /usr/local/nginx/conf/nginx.conf
...
listen 80;
server_name www.kgc.com;
...
#开启服务
service nginx start
-
安装DNS服务
yum install bind -y
vim /etc/named
...
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
...
vim /etc/named.rfc1912.zones
...
zone "kgc.com" IN {
type master;
file "kgc.com.zone";
allow-update { none; };
};
...
cd /var/named
cp -p named.localhost kgc.com.zone
vim kgc.com.zone
...
www IN A 192.168.43.229
...
#开启服务
systemctl start named
-
在测试机修改DNS服务器的地址
vim /etc/resolv.conf
...
nameserver 192.168.43.229
...
-
验证Nginx服务
-
添加域名跳转功能
#修改DNS服务配置
vim /etc/named.rfc1912.zones
...
zone "kgc.com" IN {
type master;
file "kgc.com.zone";
allow-update { none; };
};
...
cd /var/named
cp -p kgc.com.zone yun.com.zone
#在nginx配置文件中添加域名转换功能
vim /usr/local/nginx/conf/nginx.conf
...
location / {
if ($host = 'www.kgc.com'){
rewrite ^/(.*)$ http://www.yun.com/$1 permanent;
}
root html;
index index.html index.htm;
}
...
#重启服务
systemctl restart named
service nginx restart
-
验证域名转换服务
八基于客户端IP地址跳转
- 实验场景:公司网页维护,外部的IP地址访问都只显示一个固定维护页面,只有公司的IP地址才能正常访问页面
服务器IP地址 | 192.168.43.229 |
公司的IP地址 | 192.168.43.221 |
外部客户的IP地址 | 192.168.43.173 |
-
基于前面的场景的nginx服务,关闭域名转换功能,添加IP地址跳转功能
vim /usr/local/nginx/conf/nginx.conf
...
location / {
# if ($host = 'www.kgc.com'){
# rewrite ^/(.*)$ http://www.yun.com/$1 permanent;
# }
set $rewrite true;
#确定合法的IP地址
if ($remote_addr = "192.168.43.221"){
#如果不合法,执行下面的if语句
set $rewrite false;
}
#不合法IP地址,跳转出mian.html页面
if ($rewrite = true){
rewrite (.+) /main.html;
}
#匹配跳转页面的路径
location = /main.html {
root /usr/local/nginx/html;
}
root html;
index index.html index.htm;
}
...
vim /usr/local/nginx/html/main
...
<html>
<head>
<meta charset="utf-8">
<title></title>
</head>
<body>
<h2>抱歉,网站维护中!</h2>
</body>
</html>
...
#重启服务
service nginx restart
- 在公司内部机(192.168.43.221),访问服务器
-
从外部客户机上访问服务器
九.基于新旧域名跳转并且加目录
- 例如;现在访问的是http://bbs.kgc.com,现在需要将这个域名下面的数据都跳转到http://www.kgc.com/bbs,跳转后参数不变
- 基于域名跳转的情况下
- 修改DNS配置文件
vim /var/named/kgc.com.zone
...
$TTL 1D
@ IN SOA @ rname.invalid. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS @
A 127.0.0.1
bbs IN A 192.168.43.229
...
systemctl restart named
-
修改nginx配置文件中添加功能模块
vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name bbs.kgc.com;
#charset koi8-r;
# access_log /usr/local/nginx/logs/www.kgc.com.access.log main;
location /post {
rewrite (.+) http://www.kgc.com/bbs$1 permanent;
}
...
#重启服务
service nginx restart
-
在测试机上验证服务
#添加域名服务器地址
echo "ameserver 192.168.43.229" >> /etc/resolv.conf
输入下列地址
自动跳转为此地址
十.基于参数匹配跳转
- 例如:浏览器访问,http://www.kgc.com/100-100.html,会自动跳转到 http://www.kgc.com
- 修改nginx的配置文件
vim /usr/local/nginx/conf/nginx.conf
...
server {
listen 80;
server_name www.kgc.com;
#charset koi8-r;
# access_log /usr/local/nginx/logs/www.kgc.com.access.log main;
location / {
if ($request_uri ~ ^/100-100.html$) {
rewrite (.*) http://www.kgc.com permanent;
}
root html;
index index.html index.htm;
}
...
#重启服务
service nginx restart
- 输入下列地址
- 自动跳转为下列页面
十一.基于目录下所有php文件跳转
- 例如,当我们访问,http://www.kgc.com/hello/1.php,会自动跳转到,www.kgc.com
- 修改nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
...
location ~* /hello/.*\.php$ {
rewrite (.+) http://www.kgc.com permanent;
}
...
#重启服务
[root@localhost ~]# service nginx stop
[root@localhost ~]# service nginx start
- 验证服务是否成功
十二.基于最普通url请求跳转
- 例如,当我们访问某一个具体的页面,http://www.kgc.com/a.html都会帮我们转到www.kgc.com
- 访问http://www.kgc.com/a.html,时
- 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
...
location ~* ^/a.html{
rewrite (.+) http://www.kgc.com permanent;
}
...
#重启服务
[root@localhost ~]# service nginx stop
[root@localhost ~]# service nginx start
- 访问 ,http://www.kgc.com/a.html ,会自动跳转到 www.kgc.com