首页 > 系统相关 >解决 .NET Core 和 nginx 双重配置 CORS 问题

解决 .NET Core 和 nginx 双重配置 CORS 问题

时间:2024-07-04 15:56:00浏览次数:1  
标签:Control Core set nginx Access header proxy CORS

解决 .NET Core 和 nginx 双重配置 CORS 问题

在开发基于 .NET Core 的 Web 应用时,经常会遇到跨域资源共享(CORS)的问题。跨域请求是指浏览器从一个不同的域、协议或端口访问资源。在现代 Web 开发中,跨域请求非常常见,但为了安全,浏览器会阻止这些请求,除非服务器明确允许。

最近在配置 .NET Core 应用与 nginx 服务器时,遇到了一个棘手的 CORS 问题。虽然我们已经在 .NET Core 和 nginx 中配置了 CORS,但浏览器仍然提示跨域请求被阻止。本文将详细介绍问题的原因及其解决方案。

问题描述

我们在 .NET Core 应用和 nginx 服务器中都配置了 CORS,但浏览器仍然报错:Access-Control-Allow-Origin 头部包含多个值,且只允许一个值。

具体的报错信息如下:

Access to XMLHttpRequest at 'http://IP1:8090/api/login/loginPwd' from origin 'http://localhost:5173' has been blocked by CORS policy: The 'Access-Control-Allow-Origin' header contains multiple values 'http://localhost:5173,*', but only one is allowed.

通过检查响应头信息,我们发现响应头中确实存在多次设置 Access-Control-Allow-Origin 的情况:

Access-Control-Allow-Origin: http://IP2:5173
Access-Control-Allow-Origin: *

问题分析

nginx 和 .NET Core 同时配置了 CORS,导致返回的响应头中包含多个 Access-Control-Allow-Origin 头部。这种情况违反了 CORS 规范,浏览器会认为这是一个安全风险,从而阻止请求。

解决方案

为了解决这个问题,我们需要确保 CORS 配置只在一个地方进行。可以选择在 nginx 或 .NET Core 中配置 CORS,但不能同时在两者中配置。

方案 1:在 nginx 中处理 CORS 配置

如果选择在 nginx 中处理 CORS 配置,需要确保 .NET Core 应用不再设置 CORS 头信息。

nginx 配置示例:

server {
    listen 8090;
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 设置 CORS 头信息
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods *;
        add_header Access-Control-Allow-Headers *;
        add_header Access-Control-Allow-Credentials true;

    }
}
方案 2:在 .NET Core 中处理 CORS 配置

如果选择在 .NET Core 中处理 CORS 配置,需要确保 nginx 不再设置 CORS 头信息。

nginx 配置示例:

server {
    listen 8090;
    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-Port $server_port;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

        # 不设置 CORS 头信息
        # 删除以下行或注释掉
        # add_header Access-Control-Allow-Origin "*";
        # add_header Access-Control-Allow-Methods "*";
        # add_header Access-Control-Allow-Headers "*";
        # add_header Access-Control-Allow-Credentials true;
    }
}

.NET Core 配置示例:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
    {
        options.AddPolicy("AllowSpecificOrigin",
            builder =>
            {
                builder.WithOrigins("*")
                       .AllowAnyHeader()
                       .AllowAnyMethod()
                       .AllowCredentials();
            });
    });

    services.AddControllers();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseCors("AllowSpecificOrigin");

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

总结

在处理跨域请求时,确保 CORS 配置只在一个地方设置,以避免配置冲突。通过选择在 nginx 或 .NET Core 中配置 CORS,可以解决跨域请求被阻止的问题。在实际开发中,选择合适的配置方案,以满足项目的具体需求和架构设计。希望本文能帮助大家解决类似的 CORS 问题,让跨域请求更加顺畅。

标签:Control,Core,set,nginx,Access,header,proxy,CORS
From: https://www.cnblogs.com/lvyp1016520/p/18283986

相关文章

  • 使用 EFCore简单入门(实体类生成数据库表)
    1.安装Nuget包Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.Tools2.创建Book,Post两个实体类publicclassBook{///<summary>///id///</summary>publicintId{get;set;}///<summary>///......
  • Pgsql帮助类 netcore
    十年河东,十年河西,莫欺少年穷学无止境。精益求精usingNpgsql;usingSystem;usingNpgsqlTypes;usingSystem.Data;usingSystem.Collections.Generic;usingSystem.Reflection;usingSystem.Configuration;usingswapCommon;namespacePgSqlHelper{publiccla......
  • asp.net core 通过SFTP下载文件
     引用第三方库:Ssh.Net try{using(varclient=newSftpClient(ftpHost,ftpPort,ftpUsername,ftpPassword)){client.Connect();IEnumerable<ISftpFile>fileEnumerable=client.ListDirectory(remoteDirectory,null).Where(g......
  • 一文搞懂Nginx配置:轻松驾驭多域名管理的实战
    1.nginx.conf如何配置多个域名在Nginx中配置多个域名,可以通过创建单独的配置文件来实现,这样可以让配置更加清晰且易于管理。以下是配置多个域名的一个基本步骤指南:1.1.步骤1:创建域名配置文件首先,在Nginx的配置目录下创建一个用于存放各域名配置文件的目录(如果还没有......
  • linux安装netcore nginx postgresql ssh
    sudosu1.安装软件$sudoaptinstall软件名2.卸载软件$sudoaptremove软件名3.更新可用软件包列表$sudoaptupdate4.更新已安装的包$sudoaptupgrade通常安装完ubuntu之后,可以先使用upgrade更新一下当前系统中可以升级的的软件包$sudoaptupdate$sudoap......
  • Acore_characters数据库全面解释
    acore_characters数据库目前有95个表,主要存储与用户账户有关的信息。account_data包含有关客户账户和设置的数据。accountId玩家账户ID。typeValueDescription0全局-账户配置缓存2全局-账户绑定缓存4全局-账户巨集缓存time最后修改的时间。data未......
  • Acore_auth数据库全面解释
    简单说吧,如果你不会源码修改编译,单单玩数据库和DBC就能做出很有特色的端。Azerothcore的数据库是Mysql,所以你得下载个SQL管理工具,大家比较常用的是NavicatSQL,我常用的是HeidiSQL(免费)。连接数据库的话,地址、用户名和密码请自行查找服务端内的worldserver.conf文件,示例:LoginDataba......
  • Acore-world数据库之各类loot-template表全面解释
    前言Acore-world数据库涉及到掉落(不含扒窃)的表一共有11个,分别是:序号表名说明1creature_loot_template生物掉落表,其entry值对应creature_template表的和lootid值2disenchant_loot_template附魔分解掉落表,其entry值对应item_template表的DisenchantID值3fish......
  • Linux下编译Azerothcore源码
    前言终于开始介绍Linux下如何编译AzerothCore源码了,本文编译和架设方法较为繁琐和细致,含Ubuntu、Debian和Docker(相较之前的Docker教程来说本文是手动版),且涉及到搭建注册网站和对外开放服务部分,故再次声明:本网站均为技术研究,若参考本网站教程搭建对外服务,我均不负任何责任!系统环......
  • Docker编译Azerothcore源码
    维基百科Docker是一个开放源代码软件,是一个开放平台,用于开发应用、交付(shipping)应用、运行应用。Docker允许用户将基础设施(Infrastructure)中的应用单独分割出来,形成更小的颗粒(容器),从而提高交付软件的速度。Docker容器与虚拟机类似,但二者在原理上不同。容器是将操作系统层虚拟......