nginx(十一)变量和rewrite

一    变量

(1)常见变量

$args                                   请求中'携带的参数-->?(url)后面的内容',如www.abc.com/test/hello?a=1&b=2的$args就是a=1&b=2

$document_root		                    Nginx'虚拟主机'配置文件中的'root参数'对应的值

$document_uri			                当前请求中不包含指令的URI;如www.abc.com/test/hello?a=1&b=2的'document_uri'就是/test/hello,'不包含后面的参数'

$host					                'http请求中的主机头',也就是'域名'

$http_user_agent                        客户端的详细信息,也就是'浏览器的标识',用curl -A可以指定-->'场景:爬虫的限定'

$http_cookie			   	            客户端的cookie信息

$limit_rate				                如果Nginx服务器使用limit_rate配置了'显示网络速率',则会显示,如果没有设置,则显示0

$remote_addr  			                客户端的'公网IP'

$remote_port			                客户端的'端口'

$request_method		                    '请求资源的方式'-->GET/PUT/DELETE等-->'根据请求方式进行限定'

$request_filename	                    当前请求的'资源文件'的'路径名称',相当于是'$document_root/$document_uri'的组合

$request_uri				            请求的链接,包括$document_uri和$args

$scheme					                请求的'协议',如ftp、http、https

$server_protocol		                客户端'请求资源'使用的'协议的版本';如HTTP/1.0、'HTTP/1.1'、HTTP/2.0等

$server_addr				            '服务器IP地址'

$server_name			                服务器的'主机名'
	
$server_port 				            服务器的'端口号'

$uri						            和'$document_uri'相同

$http_referer				            客户端请求时的'referer',通俗讲就是该请求是通过'哪个链接跳过来'的

常用:$http_referer、$request_uri、$http_user_agent

(2)变量使用场景

禁止'Scrapy等工具'的抓取-->'针对Python爬虫'

if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
     return 403;
}
'forbidden-->禁止'非'GET|HEAD|POST'方式的抓取

if ($request_method !~ ^(GET|HEAD|POST)$) {
    return 403;
}

(3)变量在防盗链的用法

盗链的理解

①  什么是盗链

HTTP 协议中有一个用来表示'页面或资源'来源的'请求头',这个请求头叫做 'Referer'
盗链就是'盗用'别的网站的链接

1)'大佬'建一个网站,'提供下载'以提高自己知名度和吸引力,这样你就必须有'空间存储'那些供人们下载的资源

2)'不劳而获者'也建立一个网站,也提供下载服务,自己'不买'网上存储空间,而是'盗用你的下载地址',挂在我自己的网站上,并且最主要的是'未经过你同意',这就是盗链

盗链: 通过在自己网站里面'引用别人的资源链接','盗用'人家的劳动和资源-->'影响: 对别人服务器的物理资源进行压榨,影响被盗链者的网站'-->'流量在大佬侧产生'

+++++++++++++++++'分割线'+++++++++++++++++

比如你在'盗链者网站'下载一个软件,你'点开连接地址'也就是URL,你发现'它的地址'却是引用的'大佬网站'的下载地址,这就是盗链
'防盗链'功能基于'HTTP协议'支持的Referer机制,通过Referer'跟踪来源',对来源进行'识别和判断'

②  经典的现象

在'网页'引用'站外'的图片

当'浏览器'向'Web服务器'发送请求的时候,'一般会带上Referer',告诉服务器我是'从哪个页面'链接过来的,'Server-->服务器'借此可以'获得'一些信息用于'处理'

备注: 如果是直接在浏览器上输入地址,'回车进来',则'没有Refer头'

Refer:代表网页的来源,也即'上一页的地址-->从哪跳转过来的?'

重点:为什么'服务器知道'我们的图片是'从哪引用'的,也知道'客户'从那个'网站链接点击过来'的

③  防盗链的方法

④   nginx的防盗链的指令

用到'ngx_http_referer_module'模块和'$invalid_referer'变量

'语法':valid_referers none | blocked | server_names | string ...;

'可用于指令块':server、'location'

默认: 'none'
1)通过'浏览器直接'打开img的url,这时候是'没有referer的',如果'容许'这一类,那么配置valid_referers'可以包括none'

2)如果'referer不为空',但是里面的内容被'防火墙或者代理服务器'删除了,'也容许'这一类的话,可以通过'配置blocked'来绕过

黑白名单

⑤  referer案例讲解

location ~* \.(gif|jpg|png|swf|flv)$ {   需要'防盗链资源'的'文件类型'
  valid_referers none blocked *.ttlsa.com server_names ~\.google\. ~\.baidu\.;  这是'可以盗链的域名或IP地址(白名单)',一般情况可以把google、baidu、sogou、soso等域名'放进来'允许他们来'使用这些资源'
  if ($invalid_referer) {  '判断有没有referer'
    这样设置能够防盗链,不断地'302(永久)重定向'很多次,可能会'加重服务器'的负担,所以'不建议'这么做,除非有单独的图片服务器支持
    #rewrite ^/ https://www.wzj.com/picture/images/403.jpg; #如果有人非法盗链资源,则返回一张'防盗链的图片'
    return 403; '暴力的方式-->直接返回403错误代码'
  } 
}

⑥  参考链接

链接1

链接2

三  add_header

Nginx指令add_header和proxy_set_header的区别

add_header是Nginx'设置响应头'信息'给浏览器'-->要'告诉浏览器一些头信息',就要使用add_header,例如'跨域访问'

#是否允许请求带有验证信息
    	 add_header Access-Control-Allow-Credentials true;
    	 允许'跨域访问的域名',可以是一个'域的列表',也可以是'通配符*'
    	 add_header Access-Control-Allow-Origin  $allow_url;
    	 #允许脚本访问的返回头
    	 add_header Access-Control-Allow-Headers 'x-requested-with,content-type,Cache-Control,Pragma,Date,x-timestamp';
    	 告诉'Client'允许'使用的请求方法',以'逗号'隔开
    	 add_header Access-Control-Allow-Methods 'POST,GET,OPTIONS,PUT,DELETE';
    	 允许'自定义的头部',以逗号隔开,'大小写不敏感'
    	 add_header Access-Control-Expose-Headers 'WWW-Authenticate,Server-Authorization';
    	 #P3P支持跨域cookie操作
    	 add_header P3P 'policyref="/w3c/p3p.xml", CP="NOI DSP PSAa OUR BUS IND ONL UNI COM NAV INT LOC"';

跨域访问

add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Headers' 'X-Requested-With';
add_header 'Access-Control-Allow-Methods' 'GET,POST,OPTIONS'

++++由于'跨域'请求,'浏览器'会'先发送'一个'OPTIONS的预检'请求,我们可以'缓存第一次'的预检请求的失效时间++++

if ($request_method = 'OPTIONS') {
	add_header 'Access-Control-Max-Age' 2592000;
	add_header 'Content-Type' 'text/plain; charset=utf-8';
	add_header 'Content-Length' 0;
	return 204;
}

四    如何获取客户端的真实ip-->代理

注意:proxy如何传递

服务端如何获取客户端请求IP地址 - AmyZYX - 博客园

转载:HTTP 请求头中的 X-Forwarded-For,X-Real-IP - Smile杰丶 - 博客园

nginx中的内置变量host和proxy_host - 起风了

五    rewrite规则

nginx的健康检查

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值