您现在的位置是:首页 > 博文答疑 > CORS 同源策略 IIS服务器设置博文答疑

CORS 同源策略 IIS服务器设置

Leo2017-10-28【9】

简介CORS 同源策略 IIS服务器设置

背景:

开发环境: webpack + vue ,

问题:

本地前端测试需要后台API支持,我的API放测试环境上。这样本地测试域名为 ‘http://localhost:8080’,但是测试API环境在我IIS服务器上。因此跨域是必然用到的。

IIS服务器代码为PHP,先是在代码里条件CORS access,但是发现在OPTION request虽然指向同样的API地址,其实或许的信息仅仅是服务器信息,并不真实的去调用程序而消耗服务器资源。所以,我们cors access仅需要设置在IIS服务器配置文件里。我这里仅修改web.config文件如下:

    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Access-Control-Allow-Origin" value="http://localhost:8080"/>
                <add name="Access-Control-Allow-Headers" value="Content-Type"/>
                <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
                <add name="Access-Control-Allow-Credentials" value="true"/>
            </customHeaders>
        </httpProtocol>
    </system.webServer>


其实需要提及的还有两点:

Access-Control-Allow-Origin 接允许跨域的域名。'*'意思为任何域名,但是在使用中,发现有的浏览器并不支持。所以建议填写域名。
Access-Control-Allow-Credentials 为允许提交cookie,但是有的浏览器貌似也不支持。我使用的是ES6的fetch,
                                 也有可能是ES6的强制检查,并不能确定是否就是我浏览器问题。

我的访问测试访问js如下:

        let requestConfig = {
//          credentials: 'include',  //带cookie,注释掉后就没问题了。
            method: type,
            headers: {
                'Accept': 'application/json',
                'Content-Type': 'application/json'
            },
            mode: "cors", //是否同源检查。'no-cores'为不进行同源检查,但是使用后浏览器将不能读response,所以基本上必须用cors了 。
            cache: "force-cache"
        }

        if (type == 'POST') {
            Object.defineProperty(requestConfig, 'body', {
                value: JSON.stringify(data)
            })
        }
        
        try {
            const response = await fetch(url, requestConfig);
            console.log(response.status)
            var responseJson
            if(response.status == 200){
                responseJson = await response.json()
            }else{
                responseJson.return_code = 99999
                responseJson.return_message = 'HTTP交互失败'
            }
            console.log(responseJson)
            return responseJson
        } catch (error) {
            throw new Error(error)
        }


刚刚也在apache上试了下,如下操作后可以解决。

首先编辑httpd.conf

找到这行

#LoadModule headers_module modules/mod_headers.so

把#注释符去掉

LoadModule headers_module modules/mod_headers.so

目的是开启apache头信息自定义模块


然后在独立资源域名的虚拟主机添加一行

Header set Access-Control-Allow-Origin *   可以加在root 目录下的文件 .htaccess 中

意思是对这个域名的资源进行访问时,添加一个头信息


重启apache