nginx地址重写

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-goBh1EZe-1630477345519)(E:/Typort/image-20210830144327229.png)]

客户端测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S2MUynp5-1630477345521)(E:\Typort\image-20210830120253499.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nQPuaqFC-1630477345522)(E:/Typort/image-20210830144010586.png)]

第二种跳转(地址栏发生变化)
...
  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;
        }
 ...

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oJZKtu5t-1630477345524)(E:/Typort/image-20210830143615499.png)]

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

测试:跳转成功

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uOs1VbLY-1630477345525)(E:/Typort/image-20210830145350469.png)]

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)测试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6FyCysz9-1630477345528)(E:/Typort/image-20210830151727179.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-g6uML9vz-1630477345529)(E:/Typort/image-20210830151739401.png)]

可以看出不再是刚刚的首页了

4.实现浏览器与curl访问相同的页面文件,看到不同的内容

不同的浏览器返回的效果不一样

解决思路

先书写两个不同的页面,在 /usr/local/nginx/html下,其中的一个建个目录去存放,再加入一个判断,去解决页面冲突

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jrAiSRQf-1630477345531)(E:/Typort/image-20210830152543002.png)]

 为了实现上述要求,我们需要使用一个变量,下面是对这个变量的一些介绍
 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)测试效果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U7DxvO2F-1630477345532)(E:/Typort/image-20210830154938640.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5LPP7gFL-1630477345533)(E:/Typort/image-20210830155207338.png)]

也可以匹配其他浏览器和客户端,修改后面的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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LP6hmpeq-1630477345533)(E:/Typort/image-20210830160344559.png)]

添加相应的参数,再次测试

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kLOmWuZ0-1630477345534)(E:/Typort/image-20210830160523411.png)]

测试break

location 也是匹配地址栏,匹配到a.html,跳转到b.html

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zq0kR6ba-1630477345535)(E:/Typort/image-20210830161239627.png)]

验证结果
在这里插入图片描述

修改

在这里插入图片描述

再次测试,break直接结束
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值