Nginx代理AspNetCore跨域问题

在前后端分离开发中,经常出现跨域的问题,本文是记录使用Nginx来反向代理AspNetCore应用时的跨域问题

跨域

对于同一域名(主机名),同一端口,同一协议,我们认为这是同一个域,只要有一个条件不满足,就会产生跨域问题,防止跨域本身是为了主机安全,所以推荐尽量从服务端进行控制,客户端控制不在本文范围内

解决跨域

开发

开发 asp.net core 应用时,我们可以使用跨域中间件来允许所有域访问,方便进行接口调试和测试

//Startup.cs
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
      if (env.IsDevelopment())
      {
            app.UseCors(x => x.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod());
      }
 }

单体部署

但是正式生产环境中,不允许这样使用,也就是说即使配置了也还是会失效,推荐使用白名单模式,可以扩展配置文件 appsetting.json 文件,加上跨域配置

{
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "Server": "sql connection string"
  },
  "Cors": {
    "Open": true,
    "Policy": "http://www.ex.com"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  }
}

其中的 Cors 配置为跨域项,然后根据该项配置跨域,下面只是简单展示,具体还应加上验证

//Startup.cs 中 ConfigureServices
services.AddCors(options =>
{
    options.AddPolicy(name: "prod",
                      builder =>
                      {
                          if (Convert.ToBoolean(Configuration.GetSection("Cors").GetSection("Open").Value))
                          {
                              var cors = Configuration.GetSection("Cors").GetSection("Policy").Value.Split(',');
                              builder.WithOrigins(cors).WithMethods("GET", "POST", "OPTIONS");
                          }
                      });
});

//Startup.cs 中 Configure
app.UseCors("prod");

Nginx部署

使用 Nginx 进行反向代理,需要在 Nginx 上配置跨域规则,同时需要清除应用中的跨域规则,不然会出现两个跨域规则导致出错,配置 nginx.conf 如下

location / {
     if ($request_method = 'OPTIONS') {
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';

        add_header 'Access-Control-Max-Age' 1728000;
        add_header 'Content-Type' 'text/plain; charset=utf-8';
        add_header 'Content-Length' 0;
        return 204;
     }
     if ($request_method = 'POST') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
     }
     if ($request_method = 'GET') {
        add_header 'Access-Control-Allow-Origin' '*' always;
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range' always;
        add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range' always;
     }
}

想了解Nginx反向代理,点击这里

发布时间:2021-10-13
其他阅读

网页小技巧

分享一些网页开发中实用的UI小技巧,快速完成页面搭建工作。

查看原文

解决sqlite依赖无法打包单文件的问题

在一次WPF开发中,选用了sqlite作为内嵌数据库,使用 ystem.Data.SQLite 库来调用,在使用 Fody 进行单文件打包时,发现打包文成后会出现 x86 和 x64 两个特定的文件夹,分别对应着32位和64位的 SQLite.Interop.dll,本文介绍修改项目文件来实现将 sqlite 通信库一起打包成单文件的方法。

查看原文

Angular中开发一个代码库

Angular 的复杂项目中,我们可以对其拆分出不同功能模块进行开发,但是对于大型项目,或者我们直接考虑拆成库,将一部分的模块合起来组成一个库,方便复用,比如我们熟悉的各种设计组件库,就是一堆模块的合集。

查看原文

未来设计趋势-Bento Layout/便当布局

前几天找网站设计的灵感的时候,发现一个介绍2024年网站设计趋势的视频,里面介绍了一个叫 Bento Layout 的趋势,今天就给大家分享一下什么是 Bento Layout,中文称为“便当布局”。

查看原文

使用表达式树来提高反射的性能

反射是C#中一种常用的技术,反射提供了动态创建和访问对象的基础,但是反射在带来了极强的灵活性的同时,也带了极大的性能损耗,本文就介绍通过表达式树来提高反射过程中的性能。

查看原文