这个问题其实困扰我很久了,今天终于比较明白了。
如果查看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状态仅仅说明Apach/Nginx正确发送了数据,并不在意这些数据从哪来的。
事实上,RFC2616规范中说明了,Apache就是要接受这些请求的,这意味这即使proxying关闭了,Apache也要收纳这些个看起来像是代理的请求。但是Apache没有了代理,所以不会去看目标网站,只是把自己的内容返回过去,一般来说,就是这个默认的页面。
很简单,看不同的代理请求,看是否都返回了同样大小的内容,如果大小一样(如上面200后面的1552,就是返回内容的大小),那说明只是把自己的首页返回回去了。
还有一个方法,把自己的浏览器设置代理服务器为你的网站地址,随便访问什么网站,应该打开什么地址就是显示你的网站吧!
当然,我们还有更高端的方法,在命令行中输入:
telnet yoursite.example.com 80
GET http://www.baidu.com/ HTTP/1.1
Host: www.baidu.com
然后回车两次,看看是不是你的网页的源代码?
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的配置方法(没有默认站点的方法):
NameVirtualHost *:80
ServerName default.only
Order allow,deny
Deny from all
ServerName example.com
ServerAlias www.example.com
DocumentRoot /path/to/site1
Ngina的配置方法(默认站点就判断Host名称的方法):
if ($host !~ ^(example.com|www.example.com)$) {
return 444;
}
mod_security模块好像就是干这个事情的!不过最好不要,为什么呢,听说是因为如果你更改这个默认行为,有些客户端动作起来也许会有些不舒畅:)