处理跨域请求(CORS)需要通过服务器配置策略,确保不同源的客户端(如浏览器)能安全访问资源。以下是核心原理和配置方法:
一、CORS 的核心原理
- 同源策略:浏览器默认阻止跨域请求(协议、域名、端口任一不同)。
- CORS 机制:服务器通过响应头声明允许的跨域规则,浏览器据此决定是否放行。
二、CORS 配置关键步骤
在服务器端设置以下响应头:
1. 基础配置
-
Access-Control-Allow-Origin指定允许访问的源(域名),支持通配符
*(慎用)或具体域名。
Access-Control-Allow-Origin: https://example.com
-
Access-Control-Allow-Methods允许的 HTTP 方法(如
GET,POST,PUT)。
Access-Control-Allow-Methods: GET, POST, OPTIONS
-
Access-Control-Allow-Headers允许客户端携带的请求头(如
Authorization,Content-Type)。
Access-Control-Allow-Headers: Content-Type, Authorization
-
Access-Control-Allow-Credentials(可选)是否允许发送 Cookie(需与
Access-Control-Allow-Origin: 具体域名配合使用)。
Access-Control-Allow-Credentials: true
2. 处理预检请求(Preflight Request)
复杂请求(如 Content-Type: application/json)会触发 OPTIONS 预检请求,服务器需:
- 响应
OPTIONS方法。 - 返回
Access-Control-Max-Age缓存预检结果(单位:秒)。
Access-Control-Max-Age: 86400
三、常见服务器配置示例
1. .NET 6+ 示例(最小 API 或 MVC)
var builder = WebApplication.CreateBuilder(args);
// 添加 CORS 策略
builder.Services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
policy =>
{
policy.WithOrigins("https://example.com") // 允许的域名
.AllowAnyMethod() // 允许所有 HTTP 方法(GET/POST/PUT 等)
.AllowAnyHeader() // 允许所有请求头
.AllowCredentials(); // 允许携带凭据(如 Cookie)
});
});
var app = builder.Build();
// 启用 CORS 中间件
app.UseCors("AllowSpecificOrigin");
app.MapControllers(); // 如果是 MVC
app.Run();
2. .NET 5 及以下(Startup.cs)
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddCors(options =>
{
options.AddPolicy("AllowSpecificOrigin",
policy =>
{
policy.WithOrigins("https://example.com")
.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials();
});
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseRouting();
app.UseCors("AllowSpecificOrigin"); // 必须在 UseRouting 之后、UseEndpoints 之前
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
3. Nginx
location / {
add_header 'Access-Control-Allow-Origin' 'https://example.com';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'Content-Type, Authorization';
add_header 'Access-Control-Allow-Credentials' 'true';
if ($request_method = OPTIONS) {
return 204;
}
}
四、注意事项
- 安全性:避免使用
Access-Control-Allow-Origin: *,除非明确允许所有域。 - 凭证(Credentials):若启用
Allow-Credentials,必须指定具体域名。 - 预检请求缓存:合理设置
Max-Age减少请求次数。 - 测试工具:使用
curl或 Postman 验证响应头。
五、调试工具
- 浏览器控制台:查看 CORS 错误详情。
- 在线检测工具:如 test-cors.org。
通过合理配置 CORS 策略,既能保障安全,又能实现灵活的跨域资源共享。


2175

被折叠的 条评论
为什么被折叠?



