81.
哦,明白了。超速限制是 php 实现的,不是 nginx ,所以hu60bot
也需要实现
82.
@nzdwlm,我还有一个建议,你可以在HTTP请求中添加头信息,把速率限制转移给单个用户。
比如,把用户的真实IP填充在HTTP_CF_CONNECTING_IP
里,然后我在hu60 api里添加真实IP判断。
这个头信息的名称要可自定义,因为我不想让别人猜到来伪造IP记录。
/**
* 特定IP判定范围
*/
$CC_IP_LIMIT = [
// 设置特定IP n秒最多能访问的次数
'127.0.0.1' => 100,
];
/**
* 真实IP
*/
// 无代理时使用
$CC_REAL_IP = $_SERVER['REMOTE_ADDR'];
// 采用CloudFlare或百度云加速代理时使用
#$CC_REAL_IP = $_SERVER['HTTP_CF_CONNECTING_IP'];
83.
@nzdwlm,因为现在的超速都算在127.0.0.1
头上了,所以大家都连不上。把真实IP填充在头信息里,我就可以把限速算在具体用户头上了。
84.
@老虎会游泳,我还不太理解。你现在的架构应该是 nginx
转发流量到 php-fpm
或 hu60bot
吧?
-
你可以在HTTP请求中添加头信息,把速率限制转移给单个用户。
怎么加头信息?作为服务端是读取请求头吧?如果是在 nginx 之后,反代的时候 把网络的真实 ip 放在 x-real-ip
中,hu60bot
可以拿到了不是吗?
-
因为现在的超速都算在127.0.0.1头上了,所以大家都连不上。把真实IP填充在头信息里,我就可以把限速算在具体用户头上了。
你的超速不是 php 实现的吗?怎么会阻止 websocket 连接?
85.
@nzdwlm,这里达到了限速,所以没有人可以认证通过。顺便一提 udSySELORQDee6_Jxv-YPMEAsAAA
已经被我设为无效了,所以公开也没关系。
// 获取sid(跨域时禁用cookie)
sid := getRequestParam(r, "sid", noCookie)
if sid == "" || sid == "udSySELORQDee6_Jxv-YPMEAsAAA" {
m.responseUnauthenticated(ws)
logrus.Warn("authentication failed: sid not found")
return
}
// 这里达到了限速
res, err := m.hu60Client.GetProfile(context.Background(), sid)
if err != nil {
m.responseUnauthenticated(ws)
logrus.Warn("authentication failed: ", err.Error())
return
}
87.
@老虎会游泳,明白了。
真实 IP 那个,可以从 nginx 传到 后端 吗?用 IP 来限速好点
88.
@nzdwlm,如果http.NewRequestWithContext(ctx, http.MethodGet, c.fullURL("/user.index.json")
不传递IP,nginx显然不知道用户的IP是什么。
89.
@nzdwlm,所以我们需要req.Header.Set(一个自定义头信息的变量, 用户的真实IP)
90.
@nzdwlm,是hu60bot
访问了/user.index.json
,不是用户访问了/user.index.json
,nginx不可能神奇的感知到背后的用户IP是什么。
91.
@老虎会游泳,明白了,你说的是 hu60bot
请求 hu60api 时的 ip。我会加一个参数,由管理员来指定这个头的 key, value就是用户的IP。这样hu60bot
就可以在这个 api 报超速时,返回ws客户端超速对吧?
hu60bot
怎么拿到客户端真实IP?x-real-ip
可以吗?
92.
@nzdwlm,hu60bot怎么拿到客户端真实IP
:目前是以下头信息,但我建议不要假定管理员开了代理,首先使用remote addr。除非管理员指定了一个头信息参数,再使用它。
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header REMOTE-HOST $remote_addr;
95.
@老虎会游泳,api 超速时返回的也是 HTML 吗?
97.
@nzdwlm,目前有一个头信息:
header('HTTP/1.1 503 Service Unavailable');
header('Retry-After: '.$needWaitSeconds);
98.
@老虎会游泳,超速后会出现 Retry-After
响应头的话,那没必要再返回 JSON 了