同一个网站有不同的访问方式,如浏览器浏览、curl、第三方脚本抓取等等,那服务器端要如何初略判断用户是通过何种方式访问,然后再灵活的返回不同信息呢?
以 curl 为例:
默认状态下,curl 向服务器发送请求时携带的 UA 头里面是包含了 "curl" 标识的。当然也可以通过 curl -A 参数进行伪装,这个是后话。
php 中正则表达式匹配函数有 preg_match($pattern,$str) ,返回布尔类型 true 或者 false 。$pattern 为正则表达式或者匹配模式,$str 为目标字符串。我们可以如下方示例处理,以对含有 "curl" 字符串的 UA 头进行匹配:
识别出 curl 方式访问的特殊处理示例:
$pattern = '/(curl)/';
//获取请求 UA 信息
$str_ua = $_SERVER['HTTP_USER_AGENT'];
if(preg_match($pattern,$str_ua) == true){
... //识别出 curl 访问方式的后续处理
}
其他,如通过接口、脚本等方式访问网站,后台服务器端也可以构造匹配模式进行过滤:
如 $pattern = '/(curl)|(python)|(go)|(java)|(javascript)|(php)/'
**验证:**以本站搭建的 " IP 地址查询" 服务为例,如果是通过 curl 默认方式进行查询或者 UA 头含有 "curl" 字符串,则在返回 IP 地址解析结果后附加 "preg test" (正则表达式测试)字样,否则不附加:
P1.curl 默认形式 或 携带含 "curl..." 字符串的伪装 UA 进行请求时,被服务器端识别并返回特定信息
附加:
php 处理正则表达式的函数主要有:
1、正则匹配:preg_match($pattern,$str) 和 preg_match_all($pattern,$str) //preg_match() 第一次匹配后结束,preg_match_all() 会一直搜索匹配直至结尾。
2、正则替换:preg_replace($pattern,$replace_str,$str) //如 $pattern='/(hello)/';$replace_str="my";$str="hello world!",则 preg_replace("hello","my","hello world!") 的意思是搜索 "hello world!" 字符串,找到 "hello" 并替换成 "my" ,执行这个函数的结果就是返回一个 "my world!" 的字符串
3、正则分割:preg_split($pattern,$str) //返回数组 array