在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
韩顺平PHP视频听课笔记 第84讲 http请求详解,防盗链技术 1, 通过httpwatch插件来抓取http请求内容 2, http1.0短连接, http1.1长连接 http1.0短连接:每次通信时间很短,效率极低,已被废除。 http1.1长连接:通话时间长。只要现在基本都采用http1.1。
只要Connection的状态为keep-alive,就说明是通话状态 3, http是tcp/ip协议的一个应用层协议,http也是我们web开发的基础。 4, 一个问题:看一个test.html页面 <h1>abc</h1> <img src=”news.jpg”/> <img src=”news2.jpg”/> 问浏览器发出几次请求? A.1次 B.2次 C.3次 答案:3次 第一次:向服务器取出该页面本身 第二次:向服务器取出图片news.jpg。 (向网络取图片是向图片服务器发请求,把大量图片放到一个带宽很足的地方供用户使用,采用了图床技术。服务器读取到img元素,就会到src指定的url去提取图片,如果url不是网络路径,服务器就从src指定的路径获取,实质上对服务器而言网络路径和本地路径是一样的。) 第三次:向服务器取出图片news2.jpg 那么如果把test.html改成如下这样,浏览器会发送几次请求? <h1>abc</h1> <img src=”news.jpg”/> <img src=”news.jpg”/> 答案是两次。浏览器第一次请求过一次news.jpg,第二次再次请求之前,会判断出news.jpg已经请求过一次,就会从本地缓存的图片里提取,而不会再次向服务器发送http请求 例子: <h1>abc</h1> <img width="200px" src="Desert.jpg"/> <img width="200px" src="Koala.jpg"/>
<h1>abc</h1> <img width="200px" src="Desert.jpg"/> <img width="200px" src=" Desert.jpg"/>
5.http请求: 客户端连上服务器之后,向服务器请求某个web资源,称之为客户端向服务器发送了一个http请求。一个完整的http请求包括如下内容:一个请求行,若干消息头,以及实体内容,其中的一些消息头和实体内容都是可选的,消息头部和实体内容之间要用空行隔开。如下所示:
(Request-Line) GET /hsp/lesson84http/Desert.jpg HTTP/1.1 请求行,用于描述客户端的请求方式,请求的资源名称,以及使用的http协议版本号。 GET /hsp/lesson84http/Desert.jpg HTTP/1.1 表示发送的是GET请求,请求资源是/hsp/lesson84http/Desert.jpg Host localhost User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:51.0) Gecko/20100101 Firefox/51.0 【告诉服务器我的浏览器内核,操作系统】 Accept */* 【表示可接受任何数据。jpg/gif就表示只能接受jpg/gif类型的数据。】 Accept-Language zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3 【页面语言】 Accept-Encoding gzip, deflate【表示接受什么样的数据压缩格式】 Referer http://localhost/hsp/lesson84http/test.html 【表示我是从哪里来的,我从本机访问其他网站,这个Referer里面就会写入我本机的路径。这个消息头很重要,在防盗链技术中起关键作用。可以根据Referer的值来对指定的地址来源设置查看权限。】 Connection keep-alive 【keep-alive表示不要立即断掉我们的请求】 If-Modified-Since Tue, 14 Jul 2009 05:32:31 GMT If-None-Match "ce875-46ea3c3ddc7bb" Cache-Control max-age=0 从User-Agent到Cache-Control max-age=0是多个消息头,用于描述客户端请求那台主机,以及客户端的一些环境信息等。
$_SERVER全局变量中保存了以上所有的消息头的信息。同时还有其他额外的信息。 可以使用以下代码进行打印 <?php foreach($_SERVER as $key=>$val){ echo "$key = $val<br>"; } ?> 可以得到如下结果: HTTP_HOST = localhost 其中有个REMOTE_ADDR记录了来访者的IP可以通过这个变量来对来访者进行IP封禁等操作。封禁用户代码示例: <?php If($_SERVER[‘REMOTE_ADDR’]==”192.168.1.102”){ //跳转到一个警告页面 Header(“Location: Err.php“); } ?> Err.php: <?php Echo “你是一个非法用户!”; ?> $_SERVER中常用的变量: HTTP_HOST = localhost 6.请求方式 请求行中的GET称之为请求方式,请求方式有:POST, GET, HEAD, OPTIONS, TRACE, PUT 常用的有:POST,GET GET/POST区别有哪些 现在我们使用http请求,练习一下防盗链技术: <?php $str=" <html> <a href='http://localhost/hsp/lesson84http/test3.php'>我想访问test3.php</a> </html> "; echo $str; ?> 编辑http://localhost/hsp/lesson84http/test3.php <?php if(isset($_SERVER['HTTP_REFERER'])){ if(strpos($_SERVER['HTTP_REFERER'], "http://localhost/http/hsp/lesson84http")==0){ echo $_SERVER['HTTP_REFERER'].'<br>'; echo strpos($_SERVER['HTTP_REFERER'], "http://localhost/http/hsp/lesson84http").'<br>'; echo "欢迎你!!"; }else{ echo "就是不让你访问!!"; } } ?> 代码意图:从一个非当前路径的php文件test5.php里使用超链接访问到当前路径test3.php 在test3.php里设置非当前路径的文件来访问就提示“就是不让你访问” 但是预期效果不对。最后把strpos()后面的”==”修改为”===”就行了。 原因可能是因为strpos()函数的第二个参数为http://localhost/http/hsp/lesson84http,这个字符串在strpos的第一个参数$_SERVER['HTTP_REFERER']中不存在,所以函数返回一个空值
而使用”==”来判断是否相等,可能会认为空值和0相等。如果使用”===”就会避开这个隐患。 |
2022-07-18
2022-08-16
2022-11-06
2022-07-29
2022-08-18
请发表评论