页面跳转

页面跳转—rewrite

什么是页面跳转---可以将浏览器地址信息做自动变化

作用说明:

1 解决地址变更问题

2解决目录结构改变

3实现错误页面优雅显示

4解决活动页面推广

5实现网站安全访问

 

Rewrite指令可以实现跳转:更加灵活方便

案例:www.goodboy.com/image/oldboy.jpg  --->  www.goodboy.com/pic/oldboy.jpg

第一个里程:构建出不需要跳转环境,创建跳转的页面目录信息

mkdir /html/www/pic/ -p

mv QQ截图20210302174219.png oldboy.jpg

第二个里程:编写跳转指令

    server {

        listen 80;

        server_name www.goodboy.com;

        error_log /var/log/nginx/error_www.log warn;

        location / {

          root /html/www;

          index index.html index.htm;

        }

        location /image/ {

              rewrite ^/image/(.*)  /pic/$1 redirect;

          }

}

 

return指令可以实现跳转: 简单粗暴方式 应用在 HTTP协议跳转

return   状态码   跳转后地址信息;

实践说明:www.goodboy.com/image/oldboy.jpg  --->  www.goodboy.com/pic/oldboy.jpg

server {

        listen 80;

        server_name www.goodboy.com;

        error_log /var/log/nginx/error_www.log warn;

        location / {

          root /html/www;

          index index.html index.htm;

        }

        location /image/ {

            return  301  http://www.goodboy.com/pic/oldboy.jpg ;

          }

}

 

 

 

 

 

 

跳转指令标识信息作用:

前两个标记跳转后,浏览器地址栏信息不会变化

① last     本条规则匹配完成后,停止匹配,不再匹配后面的规则

② break    本条规则匹配完成后,停止匹配,不再匹配后面的规则 

PS:不想让用户获悉跳转后地址信息

后两个编辑跳转后,浏览器地址栏信息会发生变化

③ redirect   返回302临时重定向,地址栏会显示跳转后的地址     常用

④ permanent  返回301永久重定向,地址栏会显示跳转后的地址 

last和break的区别

参考地址:https://www.phpmianshi.com/?id=98

1如果2者都出现在location之外时,其作用是一致的,注意的是,它们会跳过所有的在它们之后的rewrite 模块中的指令,去选择自己匹配的location

2last 和 break 当出现在location 内部时,两者就存在了差异

 last: 使用了last 指令,rewrite 后会跳出location 作用域,重新开始再走一次刚刚的行为

 break: 使用了break 指令,rewrite后不会跳出location 作用域。它的生命也在这个location中终结。

简单的来讲就是:

Last:重新将rewrite后的地址在server标签中执行

Break: 将rewrite后的地址在当前location标签中执行

案例

server {

   listen 80;

   server_name rewrite.goodboy.com;

   root /html/rewrite;

   index index.html index.htm;

   location ~ ^/break {

      rewrite ^/break /test/ break;   break 只要匹配到规则 则会去本地站点目录中寻找请求的资源信息

   }

   location ~ ^/last {

      rewrite ^/last /test/ last;  last 只要匹配到规则 会对其所在server重新发起请求

   }

   location /test/ {

      default_type application/json;

      return 200 'ok'; 

   }

}

 

redirect vs permanent

永久跳转 301: 地址永久变化 永久跳转  www.360buy.com  --- www.jd.com

首次访问跳转请求会询问服务器,之后所有跳转请求不会询问,而是通过浏览器缓存进行跳转。

临时跳转 302:不会记录跳转信息 地址信息经常变化  临时跳转 http --- https

首次访问跳转请求会询问服务器,之后所有请求继续询问服务器,当服务器不可用时,则会出现跳转失败

 

跳转的三种方式

1网站页面uri信息跳转

http://www.goodboy.com/abc/1.html -跳转->  http://www.goodboy.com /ccc/bbb/2.html

第一个里程: 准备跳转页面环境

mkdir /html/www/ccc/bbb/ -p

echo "rewrite-test-01" >/html/www/ccc/bbb/2.html

     

第二个里程: 编写跳转配置文件

vim conf.d/www.conf

      server {

        listen     80;

        server_name www.goodboy.com;

        error_log  /var/log/nginx/error_www.log  warn;

        location / {

            root /html/www;

            index index.html index.htm;

        }

        location /abc {

            rewrite  (.*)  /ccc/bbb/2.html  redirect;

        }

      }

     

      第三个里程: 测试访问跳转功能

      PS:注意DNS解析信息     

http://www.goodboy.com/2020/ccc/bbb/2.html-跳转-> http://www.goodboy.com/2019/ccc/bbb/2.html

      第一个里程: 准备跳转页面环境 

      mkdir /html/www/2019/ccc/bbb -p

      echo "rewrite-test-02"  >/html/www/2019/ccc/bbb/2.html

     

      第二个里程: 编写跳转配置信息

      server {

        listen     80;

        server_name www.goodboy.com;

        error_log  /var/log/nginx/error_www.log  warn;

        location / {

            root /html/www;

            index index.html index.htm;

        }

        location /2020 {

            rewrite ^/2020/(.*)  /2019/$1  redirect;

        }

      }

     

      第三个里程: 测试访问跳转功能

      PS:注意DNS解析信息   

http://www.goodboy.com/course-11-22-33.html ->http://www.goodboy.com/course/11/22/33/course_22.html

      目的简化用户访问浏览操作过程

     

      第一个里程: 准备跳转页面环境 

      mkdir /html/www/course/11/22/33/ -p

      echo "rewrite-test-03"  >/html/www/course/11/22/33/course_22.html 

     

      第二个里程: 跳转页面编写过程

      server {

        listen     80;

        server_name www.goodboy.com;

        error_log  /var/log/nginx/error_www.log  warn;

       root /html/www;

        location / {

            index index.html index.htm;

        }

        location /course {

          #           /course-11-22-33.html         course/11/22/33/course_22.html

            rewrite ^/(.*)-(.*)-(.*)-(.*)\.(.*)$   /$1/$2/$3/$4/$1_$3.$5 redirect;  

        }

      }

     

      第三个里程: 测试访问跳转功能

      PS:注意DNS解析信息        

     

   

    · 网站页面url信息跳转 

      方式一: 错误方式(ERR_TOO_MANY_REDIRECTS)

      server {

        listen     80;

        server_name www.goodboy.com;

        error_log  /var/log/nginx/error_www.log  warn;

        location / {

            root /html/www;

            index index.html index.htm;

            rewrite (.*)  http://www.server.com$1; 

        }

      }

      需要修改本地解析进行测试

     

      解决思路:

      1)www.goodboy.com    --DNS解析 -- nginx(加载www.conf) -- www.goodboy.com 跳转变为www.server.com

      2) www.server.com  --DNS解析 -- nginx(加载www.conf) -- www.server.com 跳转变为www.server.com

      3) www.server.com  --DNS解析 -- nginx(加载www.conf) -- www.server.com跳转变为www.server.com

         无限循环跳转过程  

     

 

      PS:访问网站页面出现多重跳转循环问题  

      方式二:编写多server配置信息

      server {

        listen     80;

        server_name  www.goodboy.com;

        location / {

           root /html/www;

           index index.html index.htm;

           rewrite (.*)  http:// www.server.com $1 redirect;

        }

      }

      server {

        listen     80;

        server_name www.server.com;

        error_log  /var/log/nginx/error_www.log  warn;

        location / {

            root /html/www;

            index index.html index.htm;

        }

      }

     

     

     

      方式三:利用配置文件中判断功能实现跳转

      # cat www.conf

      server {

        listen     80;

        server_name www.goodboy.com www.server.com;

        error_log  /var/log/nginx/error_www.log  warn;

        location / {

            if ($http_host ~* "www.goodboy.com") {

              rewrite (.*) http:// www.server.com $1 redirect;

            }

            root /html/www;

            index index.html index.htm;

        }

      }

 

 

    · 网站页面协议信息跳转

         http://www.goodboy.com  ----->  https://www.goodboy.com

1在代理服务器前端实现跳转

   server {

         listen   80;

         server_name  www.goodboy.com;

         return   302  https://$server_name$request_uri;

        }

        upstream  myserver  {

           server 10.0.0.7:80;

        }

        server {

         listen 443 ssl;

         server_name localhost;

         ssl_certificate_key   /etc/nginx/key/server.key;

         ssl_certificate       /etc/nginx/key/server.crt;

         include /etc/nginx/proxy_conf;

         location / {

           proxy_pass  http://myserver;

         }

        }

          

  2在web网站服务器后端实现跳转

server {

       listen 80;

       server_name www.goodboy.com;

       return 302 https://$server_name$request_uri;

}

server  {

        listen       443 ssl;

        server_name  www.goodboy.com;

        error_log  /var/log/nginx/error_www.log  warn;

        ssl_certificate_key         /etc/nginx/key/server.key;

        ssl_certificate             /etc/nginx/key/server.crt;

        location / {

            root   /html/www;

            index  index.html index.htm;

        }

       }

为什么要使用https,因为http不安全,当使用HTTP访问网站时,会遭到劫持和篡改,目标主机会冒名顶替真实主机,访问过程产生数据信息会泄露。

HTTPS解决三个重要的安全问题:

    · 数据机密性问题  保证数据传输安全性

    · 数据传输完整性  避免数据被篡改  避免数据包丢失导致数据影响

    · 数据传输验证身份

网站页面信息篡改:

    正常网站:用户浏览器访问摄影网站  ---  图片信息

    异常网站:用户浏览器访问摄影网站  ---  战争  暴力  黄色

第一个里程:编写nginx配置信息

    server {

      listen     80;

      server_name www.goodboy.com;

      error_log  /var/log/nginx/error_www.log  warn;

      location / {

          root /html/www;

          index index.html index.htm;

      }

    }

   

    第二个里程:编写正常代码信息:

    <html>

    <head>

    <meta charset="UTF-8">

    <title>摄影俱乐部</title>

    </head>

    <body>

    <h1>摄影网站</h1>

    <img src="oldboy.jpg">

    </body>

    </html>

   

    ===================================================

    第三个里程: 发起攻击修改页面

    部署代理服务器,并编写配置文件

    [root@lb01 conf.d]# cat proxy.conf

    upstream  myserver  {

       server 10.0.0.7:80;

    }

    server {

     listen 80;

     server_name localhost;

     include /etc/nginx/proxy_conf;

     location / {

       proxy_pass  http://myserver;

       sub_filter '<h1>摄影网站</h1>' '<h1>政治网站</h1>';

       sub_filter 'oldboy.jpg' 'http://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1599978729723&di=683439286257a6ad0e28cdaedfa24c90&imgtype=0&src=http%3A%2F%2Fimg.ifeng.com%2Fhres%2F200808%2F23%2F10%2Fdf4eac99c82885e37877b52d9e78ebb5.jpg';

     }

    }

   

如何用https搭建访问网站?

第一个里程:需要创建私钥文件和证书文件

 

私钥文件:

PS:生成的算法有:rsa,dsa,rsa生成的私钥可以用来加密及签名,而dsa生成的秘钥只能用来签名

    openssl genrsa -idea -out  server.key  2048

    genrsa   --- 创建指定算法类型私钥

    idea     --- 创建一个带有密码信息私钥

    out      --- 将私钥信息输出到一个指定文件中

     2048     ---生成的key大小

 

   

    公钥文件:证书

    openssl req -days 365 -x509 -sha256 -nodes -newkey rsa:2048  -keyout  server.key  -out  server.crt

    req      --- 用户创建新的证书信息

    days     --- 指定证书有效期限

    x509     --- 指定证书格式类型

    nodes    --- 取消私钥密码信息

    new      --- 创建新的证书

    key      --- 通过调用私钥信息创建证书

    keyout   --- 加载识别私钥文件信息

    out      --- 将证书信息输出到一个指定文件中

第二个里程: 编写nginx配置文件

    server {

      listen     443 ssl;

      server_name www.goodboy.com;

      error_log  /var/log/nginx/error_www.log  warn;

      ssl_certificate_key   /etc/nginx/key/server.key;

      ssl_certificate       /etc/nginx/key/server.crt;

      location / {

          root /html/www;

          index index.html index.htm;

      }

    }

   

    直接访问代理服务部署过程

    1)前端配置HTTPs  后端不用进行配置

    第一个里程:获取私钥和证书信息

openssl genrsa -idea -out  server.key  2048

openssl req -days 365 -x509 -sha256 -nodes -newkey rsa:2048  -keyout  server.key  -out  server.crt

 

   

    第二个里程:编写代理服务配置文件

    # cat /etc/nginx/conf.d/proxy.conf

    upstream  myserver  {

       server 10.0.0.7:80;

    }

    server {

     listen 443 ssl;

     server_name localhost;

     ssl_certificate_key   /etc/nginx/key/server.key;

     ssl_certificate       /etc/nginx/key/server.crt;

     include /etc/nginx/proxy_conf;

     location / {

       proxy_pass  http://myserver;

     }

    }  

   

    2)前端配置HTTPs  后端需要进行配置  全栈配置HTTPS

    第一个里程:获取私钥和证书信息

openssl genrsa -idea -out  server.key  2048

openssl req -days 365 -x509 -sha256 -nodes -newkey rsa:2048  -keyout  server.key  -out  server.crt

 

   

    第二个里程:编写代理服务配置文件

    # cat /etc/nginx/conf.d/proxy.conf

    upstream  myserver  {

       server 10.0.0.7:443;

    }

    server {

     listen 443 ssl;

     server_name localhost;

     ssl_certificate_key   /etc/nginx/key/server.key;

     ssl_certificate       /etc/nginx/key/server.crt;

     include /etc/nginx/proxy_conf;

     location / {

       proxy_pass  https://myserver;

     }

    }  

   

    第三个里程:编写网站web服务器配置

    server {

      listen     443 ssl;

      server_name www.goodboy.com;

      error_log  /var/log/nginx/error_www.log  warn;

      ssl_certificate_key   /etc/nginx/key/server.key;

      ssl_certificate       /etc/nginx/key/server.crt;

      location / {

          root /html/www;

          index index.html index.htm;

      }

}  

 

PS:

证书使用注意事项:

   https证书信息不支持续费功能,证书到期需要重新申请新的证书并替换

   https不支持三级域名解析,www.oldboy.com  ---  www.test.oldboy.com

   https显示绿色, 说明整个网站页面所加载的url都是https

   https显示黄色,说明整个网站页面所加载的url部分是http

   https显示红色,可能证书是假的,或者证书已经过期失效。

HTTPS实现跳转变量

   $document_root       识别当前请求根路径信息  等价于root指令配置信息

   $host                请求信息中的host,如果请求中没有host同行,则等于设置服务器名称

   $server_name         当前用户请求的域名信息 需要和server_name指令指定的信息匹配

   $request_filename    当前请求的文件路径名称信息(资源信息)    带网站主目录         /html/img/test.jpg

   $request_uri         当前请求的文件路径名称信息(资源信息)    不带网站主机目录     img/test.jpg

   $scheme              当前使用的协议,比如http或https

posted on 2021-04-13 16:33  弓长三寿  阅读(1375)  评论(0)    收藏  举报