文章目录
nginx地址重写
地址重写(地址栏被重写)
例: www.360buy.com(京东之前的域名)-------->www.jd.com(新域名)
SSL+ http://baidu.com —> https://www.baidu.com(重写为https)
要求
沿用上次的www.a.com的配置,实现以下要求
- 所有访问a.html的请求,重定向到b.html
- 所有访问192.168.19.100的请求重定向到www.tmooc.cn
- 所有访问192.168.19.100/的请求重定向到www.tmooc.cn/下相同的页面
- 实现浏览器与curl访问相同的页面文件,返回不同的内容
实现方案:
主要用到参数 rewrite
rewrite regex replacement flag
rewrite 旧地址 新地址 【选项】
实现步骤:
1.修改配置文件(访问a.html重定向到b.html)
网站内页面跳转
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
rewrite /a.html /b.html;
#网址不会发生变化 跳转之后网址还是http://www.a.com/a.html
location / {
root html;
index index.html index.htm;
}
....
添加b的界面
echo "woshiBBB" > /usr/local/nginx/html/b.html
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
客户端测试
第二种跳转(地址栏发生变化)
...
server {
listen 80;
server_name www.a.com;
rewrite /a.html /b.html redirect;
#网址会发生变化 跳转之后网址变为http://www.a.com/b.html
location / {
root html;
index index.html index.htm;
}
...
2.修改配置文件(访问192.168.19.100的请求重定向到www.tmooc.cn)
网址跳转
1)修改Nginx服务配置
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
rewrite ^/ http://www.tmooc.cn;
#或者 rewrite / http://www.tmooc.cn; 正则匹配包含即可
#主要访问本机,都跳转到 上面这个网址
location / {
root html;
index index.html index.htm;
}
....
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
测试:跳转成功
3.访问192.168.19.100/的请求重定向到www.tmooc.cn/下相同的页面
域名跳转,子页面不变
例:
解决方法,使用正则表达式
1)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
rewrite ^/(.*) http://www.tmooc.cn/$1;
#正则中()保留,\1粘贴,但在nginx中$!代表粘贴第一个
location / {
root html;
index index.html index.htm;
}
....
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
2)测试:
可以看出不再是刚刚的首页了
4.实现浏览器与curl访问相同的页面文件,看到不同的内容
不同的浏览器返回的效果不一样
解决思路
先书写两个不同的页面,在 /usr/local/nginx/html下,其中的一个建个目录去存放,再加入一个判断,去解决页面冲突
为了实现上述要求,我们需要使用一个变量,下面是对这个变量的一些介绍
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' #日志格式,$remote_addr 变量,代表客户端的ip
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
日志每一列是什么
1.客户端的ip地址 $remote_addr
2.横线 -
3.验证的用户 $remote_user
4.方括号括起来的时间 [$time_local]
5.访问的什么的页面 "$request"
6.访问的状态$status
7.访问的网页有多少字节 $body_bytes_sent
8.代表来源 $http_referer referere 直接输网址为 - ,如果从百度来,referere = www.baidu.com
9.显示客户端的详细信息 $http_user_agent
开始实现:
1)创建网页目录以及对应的页面文件
echo " i am curl test " > /usr/local/nginx/html/test.html
mkdir /usr/local/nginx/html/firefox
echo " i am firefox test " > /usr/local/nginx/html/firefox/test.html
2)修改配置文件
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
# ~正则匹配(模糊匹配)*不区分大小写
#不写*,需要写完整的名字,Firefox
if ( $http_user_agent ~* firefox) {
rewrite ^/(.*) /firefox/$1;
}
location / {
root html;
index index.html index.htm;
}
....
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
2)测试效果
也可以匹配其他浏览器和客户端,修改后面的Firefox为你需要的客户端或者目标浏览器
总结:
地址重写格式
- rewrite 旧地址 新地址 [选项];(选项在下面已列出)
- last 不在读其他的rewrite
- break 不在读其他语句,结束请求
- redirect 临时重定向
- permament 永久重定向
测试效果
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
rewrite /a.html /b.html;
rewrite /b.html /c.html;
location / {
root html;
index index.html index.htm;
}
....
echo "A" >/usr/local/nginx/html/a.html
echo "B" >/usr/local/nginx/html/b.html
echo "C" >/usr/local/nginx/html/c.html
重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
添加相应的参数,再次测试
vim /usr/local/nginx/conf/nginx.conf
....
server {
listen 80;
server_name www.a.com;
rewrite /a.html /b.html last;
#匹配及停止,如果没有匹配,正常进行
rewrite /b.html /c.html;
location / {
root html;
index index.html index.htm;
}
....
/usr/local/nginx/sbin/nginx -s reload
测试break
location 也是匹配地址栏,匹配到a.html,跳转到b.html
验证结果
修改
再次测试,break直接结束