页面跳转
页面跳转—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
浙公网安备 33010602011771号