仅当查询字符串不同时,为啥会出现 CORS 错误

Posted

技术标签:

【中文标题】仅当查询字符串不同时,为啥会出现 CORS 错误【英文标题】:Why do I get CORS error when query string is different only仅当查询字符串不同时,为什么会出现 CORS 错误 【发布时间】:2021-10-20 05:14:18 【问题描述】:

我在调用 API 时遇到 CORS 错误,只有查询字符串不同。其余的运行良好。 (获取、发布、更新、删除)

但我无法理解这两个 URL 在 CORS 政策方面的区别:

[它不起作用] https://api.test-site.com/api/XYZ/query?type=Cat&startDate&startDate=01/06/2021&endDate=18/08/2021

[有效] https://api.test-site.com/api/ABC/query?startDate=&EndDate=&xstartDate=02/08/2021&xendDate=16/09/2021&dueStartDate=&dueEndDate=&lNumber=&es=[]&aUserIds=[]&pics=[]&kLevels=[]&rIds=[]

下面出现错误的第一个 URL;

访问 XMLHttpRequest 在 'https://api.test-site.com/api/XYZ/query?type=Cat&startDate&startDate=01/06/2021&endDate=18/08/2021' 来自原点“https://test-site.com”已被 CORS 政策阻止: 请求中不存在“Access-Control-Allow-Origin”标头 资源。

如果不是,XYZ 和 ABC 会导致这个错误吗?这个错误的原因是什么?

客户端代码:

 return axios
     .get(this.apiBaseURL() + url, 
        headers: 
           'Access-Control-Allow-Origin': this.baseURL(),
           'Content-Type': 'application/json',
        ,
        withCredentials: true,
     )

服务器端代码

  app.UseCors(options => options.WithOrigins(new["https://api.test-site.com","https://api.test-site.com/api","https://test-site.com"] ).AllowAnyHeader().AllowAnyMethod().AllowCredentials());

【问题讨论】:

你能显示你的 ABC 和 XYZ 动作标题吗? 我已经 [HttpGet("query")] 仅在两个控制器(操作)上。 【参考方案1】:

尝试使用这种语法

public void ConfigureServices(IServiceCollection services)
        
            services.AddCors(o => o.AddPolicy("AllowAnyOrigin",
                      builder =>
                       
                       builder.AllowAnyOrigin()
                              .AllowAnyMethod()
                              .AllowAnyHeader();
              ));

        .....
            
        

        
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        
            .....

            app.UseRouting();
            app.UseCors("AllowAnyOrigin");
           app.UseAuthorization();

            ....
         

如果它有效,那么您可以将 builder.AllowAnyOrigin 替换为

builder.WithOrigins("https://api.test-site.com")

并删除

 'Access-Control-Allow-Origin': this.baseURL(),

没有意义

【讨论】:

我试过了,但我收到了这样的错误--> 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:'Access-Control-Allow- 的值当请求的凭据模式为“包含”时,响应中的 Origin 标头不能是通配符“*”。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。 @mocco 尝试添加 .AllowCredentials() 但我认为这不会有帮助。请告诉我 没错,它给出了这个错误; 'CORS 协议不允许同时指定通配符(任何)来源和凭据。如果需要支持凭据,则通过列出各个来源来配置 CORS 策略 尝试将 allorigins 替换为 builder.WithOrigins("api.test-site.com") 又是这个错误; “来自原点 'test-site.com' 已被 CORS 策略阻止:请求的资源上不存在 'Access-Control-Allow-Origin' 标头。”

以上是关于仅当查询字符串不同时,为啥会出现 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥只有 Angular 才会出现 CORS 错误? [复制]

为啥我的 Axios fetch 会出现 CORS 错误?

为啥我的 axios 删除函数会出现 CORS 错误? [关闭]

当我根据 DynDNS url 名称而不是 IP 发出 axios 请求时,为啥会出现 CORS 错误?

为啥在使用 Angular http.post 而不是传统的 HTML 表单时会出现 CORS 错误?

为啥启用 CORS 后仍然出现 CORS 错误