使用Nginx过滤OPTIONS请求避免后台大量204响应及禁止访问的一些常用配置
在前后端分离项目中,由于跨域,导致前端每次请求后台都会发送一个options请求去检查目标站点是否可达,这样后台就会收到很多响应码为204的OPTIONS请求,虽然每次请求都耗时极少,但是一旦请求量大了,还是会占用部分连接资源,并且日志中也会存在很多没用的数据,导致日志文件体积增加。下面就来讲讲如何利用Nginx拦截这些OPTIONS请求。
一、问题背景
拦截请求之前 - 浏览器的请求信息
可以看到每个200
响应之前都有一个204
响应,耗时也就几毫秒,但是就是看它不爽。
同样服务器端的日志是一个204响应一个200响应
二、Nginx 配置
location /{
if ($request_method = 'OPTIONS') {
# 对于OPTIONS,不保存请求日志到日志文件
access_log off;
# 这里配置允许跨域的域名,* 代表所有,也可以写域名:http://www.xxx.com 或者IP+端口 http://192.168.1.10
add_header 'Access-Control-Allow-Origin' '*';
# 允许的请求类型
add_header 'Access-Control-Allow-Methods' 'GET, POST, PUT, DELETE, OPTIONS';
add_header 'Access-Control-Allow-Credentials' true;
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
# 允许跨域的最大时间,超过这个时间又会重发一次OPTIONS请求获取新的认证
add_header 'Access-Control-Max-Age' 1728000;
add_header 'Content-Type' 'text/plain charset=UTF-8';
add_header 'Content-Length' 0;
# 直接在这里返回204响应,不转发到后台服务程序
return 204;
}
# 原来怎么写这里还怎么写
...
}
最后的效果:前端依然会发送OPTIONS请求,因为要判断请求是否可达;但是后台的日志中没有OPTIONS
请求了,因为请求到Nginx
那被拦截了,直接就返回浏览器了,没有到达后台服务程序。
三、禁止访问的一些扩展配置
同样的思路可以配置一些防止爬取的配置之类,如下:
#禁止访问的文件或目录
location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) {
return 404;
}
location / {
#禁止Scrapy等工具的抓取
if ($http_user_agent ~* (Scrapy|Curl|HttpClient)) {
return 403;
}
#禁止指定UA及UA为空的访问
if ($http_user_agent ~* "FeedDemon|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot|CrawlDaddy|CoolpadWebkit|Java|Feedly|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|oBot|jaunty|Python-urllib|lightDeckReports Bot|YYSpider|DigExt|HttpClient|MJ12bot|heritrix|EasouSpider|Ezooms|^$" ) {
return 403;
}
#禁止非GET|HEAD|POST方式的抓取
if ($request_method !~ ^(GET|HEAD|POST)$) {
return 403;
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律