跨域请求CORS配置方法详解

处理跨域请求(CORS)需要通过服务器配置策略,确保不同源的客户端(如浏览器)能安全访问资源。以下是核心原理和配置方法:


一、CORS 的核心原理

  1. 同源策略:浏览器默认阻止跨域请求(协议、域名、端口任一不同)。
  2. 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;
    }
}

四、注意事项

  1. 安全性:避免使用 Access-Control-Allow-Origin: *,除非明确允许所有域。
  2. 凭证(Credentials):若启用 Allow-Credentials,必须指定具体域名。
  3. 预检请求缓存:合理设置 Max-Age 减少请求次数。
  4. 测试工具:使用 curl 或 Postman 验证响应头。

五、调试工具

  • 浏览器控制台:查看 CORS 错误详情。
  • 在线检测工具:如 test-cors.org

通过合理配置 CORS 策略,既能保障安全,又能实现灵活的跨域资源共享。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jingzhi. Chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值