location和重定向:
重定向:就是输入的网站之后会跳转到设定的目标地址
rewrite:使用nginx提供的全局变量或者是自己设置的变量,集合正则表达式和标志位实现url/uri重定向
- 1、更换域名
- 2、特殊情况,比方说页面需要维护,但是我不想中断服务,可以实现url的跳转,访问正常的服务器
- 3、防盗链
www.baidu.com ·················》www.sina.com
www.baidu.com/test1 ··············》www.sina.com/test2
rewrite跳转:
1、nginx http rewrite_module:
- 支持url重定向
- 支持条件判断
- if语句,没有else
2、语法配置:
rewrite正则表达式 跳转后的内容 标志位
标志位的类型:
1、permanent ···········》永久重定向,返回码301
2、redirect:···········》临时重定向,返回码302
3、break 跳转时不会改变url:
break是安装location的规则进行匹配的,匹配到即终止,不属于3**开头的重定向范围之内
4、last ·········呢明天规则匹配完毕之后,继续向下匹配新的location规则
break和last没有跳转到返回码,属于匹配location的机制
last一旦陷入死循环,内部循环10次就会停止,然后报错500:
- 1、服务器故障
- 2、防火墙屏蔽
- 3、应用的端口没有启动:
①、配置文件写错
②、有其他应用占用了本服务的端口
③、服务器资源不够,应用无法启动
④、磁盘空间不足 - 4、last匹配机制导致陷入死循环,10次之后就会报错500
- 5、检查网络
rewrite /test/(.*)/xy104/$1 redirect
(.*):正则表达式匹配的内容进行捕获
/usr/local/nginx/html/test/index.html
/usr/local/nginx/html/xy104/index.html
301和302:
-
301永久重定向:永久性的变更url,搜索引擎的排名和权重会转义到新的url,客户端会保留新的url
-
302临时重定向:短期的urk变更,一般用在维护时,搜索引擎的排名和权重不会转移到新的url,客户端会继续访问原始的url
1、基于域名的跳转:
www.xy105.com ·················》www.xy104.com
2、基于ip的跳转:
192.168.31.13这个服务器的网页正在维护,只有本机可以访问,其他主机访问统一显示正在维护中
rewrite ^/ (.*) $ http://www.xy105.com/$1 permanent
匹配$host的路径
www.xy105.com/(.*) 数码 物流
www.xy104.com/$1 数码 物流
set $rewrite true
↓
set 设置变量的值,$rewrite的值设置为布尔类型的true
↓
if ($remote_addr = "192.168.31.13" ) {
set $rewrite false;}
if( $rewrite =true ) {
rewrite (.+) /error.html;}
↓
#非192.168.31.13的ip地址,统一跳转到error.html的页面内容
location =/error.html {
root html}
基于后缀名的跳转:
www.xy105.com/test1/index.php
www.xy104.com
↓
s
server {listen 80;server_name www.xy105.com;location /test1/index.php {rewrite ^/test1/index\.php$ http://www.xy104.com permanent;}
}
nginx的正向代理,反向代理和nginx内置变量的介绍
nginx内置变量:请求方 ··········> 响应方
- $uri:可以获取客户端请求的地址,不包含主机和查询的参数
- $request_uri:请求客户端的请求地址-$host:请求的主机名?客户端······>发送请求的url地址- $http_user_agent:获取客户端请求的浏览器和操作系统- $remote_addr:客户端的ip地址(可以隐藏)- $remote_port:客户端请求的端口- $request_method:获取客户端的请求方式,get post- $scheme:获取请求的协议,http协议 https- $request_filename:获取客户端请求的文件名- $document_root:当前请求的根目录
nginx在配置location匹配时,会使用两个获取头部的内置变量:
X-Real-IP:直接向服务端发送客户端访问的真实ip地址
X-Forwarded-For:传递完整的代理链,只要数据包经过代理,都会被传递给nginx,记录所有的代理地址和客户端的真实ip★★★★★
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for ;
记录所有经过的代理地址★★★★★
在nginx内部获取变量的值
nginx的代理:
正向代理:
代理:
可口可乐 ·············》超市···············》客户
访问一个代理的地址 ···················》我们目标访问的网页
代理:VPN 科学上网、加速
在内网环境中,只有特定的ip地址才可以访问内网的服务(ssh,网页)
- 堡垒机(跳板机)
正向:
七层
反向:
四层 ············ 传输层 ip+端口
七层 ·············应用层 http协议
四层代理和七层代理之间的区别:
1、 四层代理是基于tcp/ip协议层的代理转发方式,只是基于ip+端口号的形式实现代理
四层代理无法获取http请求中的url信息,只是对数据包进行转发
四层转发数据包,是由内核进行转发,速度更快
2、 七层代理是通过http协议进行代理转发的方式,可以处理http的请求和响应
当收到http请求之后,根据代理的方式,把http请求转发到指定的服务器
可以对http请求进行深入的分析和处理,可以对请求内容做路由,可以做流量控制,可以进行内容过滤等等
七层代理是由应用层处理,用户态来处理,速度相对较慢,但是更安全,更可靠
都是能够做四层代理和七层代理的:nginx、Haproxy
lvs:只能做四层转发
正向代理:
正向代理都是对请求进行处理,属于七层代理
-----------面向客户端,客户端想要访问web服务器,但是客户端的ip地址禁止访问,可通过代理的ip地址访问目标的服务器
服务端只会知道代理服务器的地址,但是不知道客户端的ip地址
特点:
1、代理的ip地址和访问的服务端对客户端来说是已知的
2、后端服务器不知道客户端的ip地址
include /usr/local/ngin/conf.d/*.conf;
添加了这一段之后,可以在conf.d这个目录里配置多个conf文件,也可以有其他的配置文件,作为服务的配置文件
server {
listen 8888;
server_name localhost;
resolver 218.2.135.1 valid=300 ipv6=off;
#设置dns的解析地址,解析的缓存时间是300s,每隔300s重新解析一次
resolver_timeout 30s;
#设置解析服务的超时3s
proxy_read_timeout 30s;
#设置代理服务器读取的超时时间
proxy_send_timeout 30s
#代理服务器向后端服务器发送数据的超时时间
proxy_connect_timeout 30s
#代理服务器和后端服务器建立连接的超时时间
#固定代理地址set $url "www.baidu.com";location /{proxy_pass http://$url;#请求转发的语句proxy_buffers 256 4k;#设置后端缓存影响的缓冲区为256个,每个大小为4k
proxy_max_temp_file_size 0;#nginx不保存响应数据的临时文件,防止文件过多,占用硬盘空间
proxy_cache_valid 200 302 1m;#针对响应码是200和302,缓冲的有效期是1分钟
proxy_cache_valid 301 1h;#针对响应码是301,缓存的有效期是1小时
proxy_cache any 1m;# 除了200,301,302以外,其他的响应码都缓存1分钟
}
vim zddl.conf
server {listen 8889;location / {proxy_pass $scheme://$http_host$request_uri
#将请求代理的地址自动设置proxy_set_header Host $http ;
#在请求头当中传递客户端的host信息proxy_set_header X-Real-IP $remote_addr
#设置客户端的请求当中包含真实的ip地址proxy_set_header X-Forwarded-For $proxy_add_x_fowarded_for ;
#传递客户端经过的代理地址proxy_set_header X-Forwarded-Proto $scheme;
#传递客户端的请求的协议信息http httpsproxy_set_header X-Forwarded-Host $host;
#传递客户端的主机名(IP地址)proxy_set_header X-Forwarded-Port $server_port;
#传递给服务端,客户端请求服务端的端口resolver 218.2.135.1;
#设置dns地址
}}}