apache/nginx访问日志中出现其他网站的GET记录

By | 2015/07/23

这个问题其实困扰我很久了,今天终于比较明白了。

如果查看apache或者nginx的access.log,可能会看到如下的记录

access.log:183.60.48.25 – – [10/Oct/2015:11:40:13 +0800] “GET http://www.baidu.com/ HTTP/1.1” 200 1552 “-” “-“

可以看到,他访问了一个其他网站,当然不一定是baidu,可以是其他任何的网站,而且居然返回了200状态码,真的是成功了吗?

一旦看到这些记录,基本说明有人尝试将你的网站服务器作为代理使用,通过你的服务器访问他真正想要访问的网址,为什么这么做呢?这往往是要点击一些收费广告,投票等系统,这些系统会判断是否同一个IP来防止无效的点击。

很显然,我们可不希望自己被别人当刀来使!

那么,如何避免这些连接其他网站的请求呢?

首先,确定不需要代理功能,直接把Proxy模块禁用了吧!看看LoadModule中mod_proxy的部分,发现就注释掉。仅仅去掉ProxyRequests指令并不能防止类似的请求。Nginx默认就是个代理,貌似关闭不了……

如果你需要代理功能,那就要好好设置段了,请搜一下其他的相关文章。

我已经设置关闭代理了,但是那个200返回码是个什么鬼?

200状态仅仅说明Apach/Nginx正确发送了数据,并不在意这些数据从哪来的。

事实上,RFC2616规范中说明了,Apache就是要接受这些请求的,这意味这即使proxying关闭了,Apache也要收纳这些个看起来像是代理的请求。但是Apache没有了代理,所以不会去看目标网站,只是把自己的内容返回过去,一般来说,就是这个默认的页面。

我明白了,我怎么能确定我的服务器没问题

很简单,看不同的代理请求,看是否都返回了同样大小的内容,如果大小一样(如上面200后面的1552,就是返回内容的大小),那说明只是把自己的首页返回回去了。

还有一个方法,把自己的浏览器设置代理服务器为你的网站地址,随便访问什么网站,应该打开什么地址就是显示你的网站吧!

当然,我们还有更高端的方法,在命令行中输入:

然后回车两次,看看是不是你的网页的源代码?

我看到我的log里还有很多CONNECT请求,怎么回事?

access.log:183.60.48.25 – – [10/Oct/2015:11:40:13 +0800] “CONNECT smtp.163.com:25 HTTP/1.0” 200 1456

这个CONNECT方法呢,也是Proxy的一种,一般是用来做SSL管道代理的,当然端口可以有很多种可能,像上面,就是想尝试发送邮件的。

一般来说,如果禁用了Proxy,这样的请求Apache会回复405状态码的(Method not allowed)。虽然不会有什么问题,不过PHP还是要运行一下尝试做这个事情,所以我们最好直接禁用除了我们想要的方法(一般就是GET,POST,HEAD)之外的所有方法。最好的方法嘛,我们除了自己的域名,其他的莫名其妙的请求都不要过来问我了!

Apache的配置方法(没有默认站点的方法):

Ngina的配置方法(默认站点就判断Host名称的方法):

能不能直接抛弃这些请求

mod_security模块好像就是干这个事情的!不过最好不要,为什么呢,听说是因为如果你更改这个默认行为,有些客户端动作起来也许会有些不舒畅:)


发表评论

电子邮件地址不会被公开。 必填项已用*标注