跨域问题原因分析与解决办法

1.问题

前端报跨域错误,导致页面错误或展示异常等问题,如图

2.原因

CORS,常被大家称之为跨越问题,准确的叫法是跨域资源共享(CORS,Cross-origin resource sharing),是W3C标准,是一种机制,它使用额外的HTTP头来告诉浏览器 让运行在一个 origin (domain) 上的Web应用被准许访问来自不同源服务器上的指定的资源。当一个资源从与该资源本身所在的服务器不同的域或端口请求一个资源时,资源会发起一个跨域 HTTP 请求。

什么情况下会存在跨域?

1)XMLHttpRequest 或 Fetch 发起的跨域 HTTP 请求。
2)Web 字体 (CSS 中通过 @font-face 使用跨域字体资源),,因此,网站就可以发布 TrueType 字体资源,并只允许已授权网站进行跨站调用。
3)WebGL 贴图。
4)使用 drawImage 将 Images/video 画面绘制到 canvas
5)样式表(使用 CSSOM)。

以Web 字体 为例,引起跨域问题的字体导入方式如下:

3.解决方法

在被访问资源服务器配置跨域设置,允许某个域名或所有域名发起的跨域请求。下面以MVC项目为例讲解如何设置跨域配置

方法一(允许全部域名)

最简单的设置,就是在 Web.config 中,将 Access-Control-Allow-Origin 设置为 * 即可,如下所示

复制代码
<system.webServer>
    <!-- 其它配置 -->
    <httpProtocol>
        <customHeaders>
            <!-- 跨域配置 -->
            <add name="Access-Control-Allow-Origin" value="*" />
        </customHeaders>
    </httpProtocol>
</system.webServer>
复制代码

方法二(指定具体的单个域名)

这种情况很好处理,在上面的配置中,将 Access-Control-Allow-Origin 的 value 设置为该域名(http://bbb.aaa.com)即可。注意不能使用泛域名。

方法三(指定多个域名)

安装URL Rewrite 组件

该组件安装好后(重启服务器),在 Web.config 中定位到 <system.webServer>,不用再添加 <httpProtocol> 中的跨域配置了,取而代之的是添加 <rewrite> 的配置,如下所示

复制代码
<system.webServer>
    <!-- 其它配置 -->
    <rewrite>
        <outboundRules>
            <rule name="AddCrossDomain">
                <match serverVariable="RESPONSE_Access_Control_Allow_Origin" pattern=".*" />
                <conditions logicalGrouping="MatchAll" trackAllCaptures="true">
                    <add input="{HTTP_ORIGIN}" pattern="(http(s)?://((.+\.)?domain1\.com|(.+\.)?domain2\.com|(.+\.)?domain3\.com))" />
                </conditions>
                <action type="Rewrite" value="{C:0}" />
            </rule>
        </outboundRules>
    </rewrite>
</system.webServer>
复制代码

参考:

https://blog.csdn.net/xcbeyond/article/details/84453832

https://www.jianshu.com/p/85855a991275

posted @   冬音  阅读(4143)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示