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 控制相应功能 来限制 |