一、UA是什么?

User Agent 简称UA,就是用户代理。通常我们用浏览器访问网站,在网站的日志中,我们的浏览器就是一种UA。

二、禁止特定UA访问

最近有个网站(www.C.com)抄袭公司主站(www.A.com)的内容,除了域名不同,内容、图片等都完全是我们主站的内容。

出现这种情况,有两种可能:

一种是:它用爬虫抓取公司主站(www.A.com)的内容并放到自己服务器上显示;

另一种是:通过将访问代理至公司主站(www.A.com),而域名(www.C.com)是盗用者的,骗取流量。

无论怎样,都要禁止这种行为的继续。

通过分析日志,没有发现爬虫大量爬取公司主站(www.A.com)内容页面的信息。

测试是否是代理,测试步骤:

1)访问www.C.com并指定参数

URL : www.C.com/chaojikaifangfu.html/?cccc

2)检查公司主站的web服务器上的nginx日志

发现有记录,说明刚才的访问被代理到公司主站web上了。

UA(双引号里边的是UA的全名):Resty/HTTP 0.03 (Lua)

有两种方法解决:

1)禁止IP

2)禁止UA

从nginx日志观察,访问者的代理IP经常变,但是访问UA却是固定的,因而可以禁止UA。

禁止特定UA:

1)nginx配置信息

nginx配置目录:/usr/local/nginx/conf/

2)在nginx配置目录中,创建新的配置文件agent_deny.conf,添加如下内容:

# 禁止特定UA访问
# ~ "Lua" :表示用户UA匹配"Lua"字符串,区分大小写
# 当用户UA被匹配成功,则返回403错误,不给予访问。
if ($http_user_agent ~ "Lua"){
return ;
}

3)添加该配置到相应的server或location段

include  agent_deny.conf;

注意:不能加到http段,if 用于http段会报语法错误的。

4)使配置生效

nginx -t
nginx -s reload

5)检查禁止特定UA的功能是否成功

利用curl工具,指定UA去访问公司主站(www.A.com)

没禁止特定UA前,访问结果:

# curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com
HTTP/1.1 OK
Content-Type: text/html; charset=utf-
Connection: keep-alive
Date: Thu, Nov :: GMT
Content-Length:
Vary: Accept-Encoding
Age:
Pragma: public
Server: nginx
Accept-Ranges: bytes

禁止特定UA后,访问结果:

# curl -I -A "Resty/HTTP 0.03 (Lua)" www.A.com
HTTP/1.1 Forbidden
Server: nginx
Date: Thu, Nov :: GMT
Content-Type: text/html
Content-Length:
Connection: keep-alive

对比两次结果,发现:nginx已经能禁止特定的UA访问了。

补充:

观察一阵子后,发现还有禁止UA为空的访问和放行内网ip不做禁止的需求。

nginx的配置中不支持if条件的逻辑与、逻辑或运算 ,并且不支持if的嵌套语法,但我们可以使用变量达到想要的效果。

#白名单:192.168.
#禁止特定UA和UA为空的访问 set $flag ; if ($remote_addr !~ "^(192.168.1)"){
set $flag "${flag}1";
} if ($http_user_agent ~ "Lua|^$"){
set $flag "${flag}2";
} if ($flag = ""){
return ;
}

注意:以下的写法是错误的!!!

if ($remote_addr !~ "^(192.168.1)" && $http_user_agent ~ "Lua|^$") {
return ;
}

nginx禁止特定UA访问的更多相关文章

  1. Nginx禁止特定用户代理(User Agents)访问(转)

    Nginx可以通过各种方式来限制访问,例如NGINX基本Http认证.allow/deny等等,这些都是前文提过的,今天来看看nginx如果通过用户代理来禁止访问. user agent是什么? 用户 ...

  2. 设置nginx禁止IP直接访问,只能通过指定的域名访问

    nginx的版本是1.2.1. 设置配置文件disableip.conf: server {     listen 80;     server_name _;     return500; } 这是 ...

  3. nginx禁止未绑定域名访问 并且强行断开连接

    总有些人,会把自己的域名绑到你的主机上. 出于什么原因,我没想到,但你肯定不愿意别人这么做. 在nginx中,用以下代码,配置一个默认主机. server { listen 80 default_se ...

  4. linux禁止特定ip访问某个端口

    linux禁止特定ip访问某个端口   解决方法: 禁止特定ip访问8501端口的命令0:iptables -I INPUT -s 192.168.0.232 -ptcp --dport 8501 - ...

  5. Nginx禁止IP直接访问网站

    禁止别人直接通过IP访问网站,在nginx的server配置文件前面加上如下的配置,如果有通过IP直接访问的,直接拒绝连接(需要去掉别的server下的default_server). server ...

  6. Nginx禁止使用ip访问,只允许使用域名访问

    Nginx虚拟主机配置,vhosts下面有很多域名的配置: [root@external-lb01 vhosts]# pwd/data/nginx/conf/vhosts [root@external ...

  7. Nginx禁止使用IP访问

    在nginx的访问日志中,会出现只显示IP,而不出现域名的情况,在经过尝试之后,是因为没有设置禁止IP访问导致的. 下面就是在配置文件中设置禁止IP访问,来实现日志文件中$host显示域名. vim ...

  8. 禁止特定IP访问Oracle数据库

    通过使用数据库服务器端的sqlnet.ora文件可以实现禁止指定IP主机访问数据库的功能,这对于提升数据库的安全性有很大的帮助,与此同时,这个技术为我们管理和约束数据库访问控制提供了有效的手段 在sq ...

  9. nginx 禁止某IP访问

    首先建立下面的配置文件放在nginx的conf目录下面,命名为blocksip.conf: deny 95.105.25.181; 保存一下. 在nginx的配置文件nginx.conf中加入:inc ...

随机推荐

  1. es6总结(一) ——开发环境

    我们使用Babel把ES6编译成ES5 安装方法: a.先建立一个项目的工程目录,并在目录下边建立两个文件夹:src和dist src:书写ES6代码的文件夹,写的js程序都放在这里. dist:利用 ...

  2. signature验证/salt验证/token验证的作用

    1.salt验证: salt是随机生成的一串字符,salt验证的作用是将生成的salt与加密的密码密文拼接后再次加密存储  这样可以是存储在数据库中的密码更加安全 2.signature验证: I.将 ...

  3. quartz定时任务框架调度机制解析

    转自集群调度机制调研及源码分析 quartz2.2.1集群调度机制调研及源码分析引言quartz集群架构调度器实例化调度过程触发器的获取触发trigger:Job执行过程:总结:附: 引言 qurat ...

  4. ServiceStack.Redis之IRedisClient(转载)

    一.属性 IRedisClient的属性如下: 属性 说明 ConnectTimeout  连接超时 Db 当前数据库的ID或下标 DbSize  当前数据库的 key 的数量 HadExceptio ...

  5. 人人都是产品经理?关于PM你不知道的还有很多

    产品经理的职称最早出现在P&G宝洁公司,因效果非常显著,许多企业纷纷仿而效尤.硅谷知名的产品管理大师Marty Cagan在<Inspired: How To Create Produc ...

  6. iOS 处理图片的一些小 Tip

    UIImage 缓存是怎么回事? 通过 imageNamed 创建 UIImage 时,系统实际上只是在 Bundle 内查找到文件名,然后把这个文件名放到 UIImage 里返回,并没有进行实际的文 ...

  7. Eigen下载安装

    首先提供Eigen的两个重要网站 官方网站 下载地址 1.下载 wget http://bitbucket.org/eigen/eigen/get/3.3.5.tar.gz 2.解压缩 tar -zx ...

  8. python_字符串常用操作

    name = "monicao"name.capitalize() #首字母大写print(name.capitalize()) print(name.count("o& ...

  9. 集成swagger2构建Restful API

    集成swagger2构建Restful API 在pom.xml中进行版本管理 <swagger.version>2.8.0</swagger.version> 给taosir ...

  10. 【转】C语言将字符串转换成对应的数字(十进制、十六进制)

    转自:http://wawlian.iteye.com/blog/1315133 1.一个十进制数字的字符串表示转换成对应的整数.举例:将“1234”转换成整数1234 /*将字符串s转换成相应的整数 ...