首页 > node express莫名其秒的访问日志

node express莫名其秒的访问日志

网站运行收到类似如下的日志,而且还很多:

[2016-06-23 07:57:17][::ffff:123.56.77.64][NONE] [GET http://www.izhongsai.com/?t=1466639837014 - - 200] 5.280

请问这种日志怎么来的?为什么没有前缀 /?

而一般的日志格式至少应该是这样的:

[2016-06-23 09:15:35][80.82.78.38][NONE] [GET /cache/global/img/gs.gif - - 404] 88.300

系统使用的是nodejs搭配express,日志中间件为mogan。简单分析的原因是这种访问日志来源于系统内部,但又不确定来源于哪个部分,是否爬虫会带来这种奇妙的日志呢?

望了解这个问题的朋友解惑,谢谢!


找到答案了,参考
http://stackoverflow.com/questions/31626234/preventing-external-requests-expressjs/31695623#31695623

译下搬过来:

这个问题是可以通过连接到web服务器后模拟一个http格式的报文的形式重现。
假设web服务器运行在本地,如果在ubuntu下,可以使用netcat发送一个请求,如:

netcat localhost 8080
GET http://example.com/path.php HTTP/1.1
#回车
#回车

虽说这不是一个规则的http请求,nodejs还是能够正确的处理它,只是传到nodejs里面的url就不仅仅是包含一个路径,竟然特么的还包含协议和域名之类的东西!对于某些版本的node,express,就有可能会被它搞死!

至于为毛有些会返回200,这大概跟你的程序逻辑处理的方式有关了!

所以嘛,就不要再想当然的认为收到的请求的url(express中是originalUrl)会一定是以‘/’开头了,可能有些不仅仅不是‘/’开头,甚至连正确的协议和域名都没有!

在express中,不低于v4版本,好像已经解决了url不以‘/’开头的问题,但却没有修改和处理originalUrl,不管咋滴,还是不要认为url一定是以‘/’开头的。

解决这个问题还是比较简单滴,就像下面的例子一样,把它放在日志的插件前面,就不会被记进日志里面了!

app.use(function(req, res, next) {
    if(req.url[0] !== '/' || req.originalUrl[0] !== '/') {
        res.status(404).send('');
    } else {
        next();
    }
});
【热门文章】
【热门文章】