1
edis0n0 OP 没有 CDN 和 WAF ,传统企业这些服务预算肯定批不下来,不用提了
|
2
foolishnobody 2023-01-15 21:21:53 +08:00 via Android
前面加个 cf 试试
|
3
idragonet 2023-01-15 21:38:04 +08:00
CDN 也有免费的。
|
4
edis0n0 OP |
5
learningman 2023-01-15 22:05:38 +08:00
Nginx Proxy Cache ,可以存硬盘上
|
6
learningman 2023-01-15 22:07:48 +08:00
或者如果真的确信不会变动,wget -r 把所有页面下载下来,nginx 直接静态提供
|
9
zhchyu999 2023-01-15 22:31:36 +08:00
最好 CDN 解决,其次 Nginx ,通过限制 IP 请求次数,缓存似乎不治本,也不一定治标
ASP.NET Core MVC 应该有一个拦截器,把渲染过后的 HTML 缓存起来 |
10
hgc81538 2023-01-15 22:50:49 +08:00 via iPhone
|
11
thinkershare 2023-01-15 23:00:22 +08:00
|
12
ryd994 2023-01-16 01:53:52 +08:00 via Android
用好 proxy_cache 和 proxy_store ,可以实现你的需求。proxy_cache_key 可能需要一些调整优化。
限制请求频率是后话,因为如果不做好缓存,限制请求频率很容易误伤正常用户。 |
13
kkk9 2023-01-16 02:21:25 +08:00
ngx_lua:先载出一个纯 js 验证页,简单算法带上值验证,正确跳转 ASP.NET ,不正确(没有的)直接拉黑 IP 。拉黑机制自行斟酌,顺便可以过滤不正常的 UA
|
14
edis0n0 OP @kkk9 #13 企业官网是要考虑搜索引擎 SEO 的,还要维护一个搜索引擎 IP 白名单,国内有的搜索引擎好像没给爬虫 IP 段
|
15
dayeye2006199 2023-01-16 04:09:09 +08:00
免费的不让用,收费的没预算。。左转换领导
|
16
netnr 2023-01-16 08:48:29 +08:00 via Android
#12 提到的磁盘缓存感觉是最适合的方案
个人目前用这种方式做 unpkg 白名单镜像 |
18
lslqtz 2023-01-16 09:31:29 +08:00
然后国内的付费 CDN, 5 秒盾部分也有, 不出意外也是有爬虫白名单的.
|
19
quan01994 2023-01-16 09:44:08 +08:00
https://learn.microsoft.com/zh-cn/aspnet/core/performance/caching/output?view=aspnetcore-7.0
你可以看看微软官方文档,这个功能应该可以解决你的问题 。 |
20
ragnaroks 2023-01-16 14:19:34 +08:00
前面套 CF ,其次控制器上加 [ResponseCache]
|
21
xioxu 2023-01-16 17:02:41 +08:00
自己写一个 Filter ,自行控制过期、缓存逻辑。
|
22
xioxu 2023-01-16 17:09:31 +08:00
这是 chatGPT 生成的示例代码:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class CacheFilter : IActionFilter { private static ConcurrentDictionary<string, byte[]> _cache = new ConcurrentDictionary<string, byte[]>(); public void OnActionExecuted(ActionExecutedContext context) { if (context.Result is FileResult) { // 缓存 FileResult 类型的结果 var file = context.Result as FileResult; using (var stream = new MemoryStream()) { file.CopyTo(stream); var key = $"{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}"; _cache.TryAdd(key, stream.ToArray()); } } } public void OnActionExecuting(ActionExecutingContext context) { var key = $"{context.HttpContext.Request.Path}{context.HttpContext.Request.QueryString}"; if (_cache.TryGetValue(key, out var data)) { // 如果缓存中有,则直接返回 context.Result = new FileContentResult(data, "application/octet-stream"); } } } |
24
zimrigeek 2023-01-17 17:17:41 +08:00
面对攻击 最有效的解决方案一般 2 大类,1 是从 Web Server 端限制流量,2 是从 CDN 限制流量
1. Web Server 端限制流量 无论是 nginx 还是 openresty 均有相关模块可以直接调用 nginx.conf http{ ... # 防止 CC 攻击配置; limit_conn_zone $binary_remote_addr zone=perip:10m; limit_conn_zone $server_name zone=perserver:10m; ... } vhost.conf server{ ... # 并发限制; limit_conn perserver 500; limit_conn perip 50; limit_rate 5120k; # 并发限制-END ... } 2. CDN 一般因厂商而异,通过流量、CC 控制相应功能 来限制 |