常见问题 IIS谓词、CORS跨域

烂柯 发布于 2022-04-28 367 次阅读


一、IIS谓词、请求返回 405

有条件的,在安装IIS的时候就不要安装WebDAV模块

web.config中system.webServer节点添加,如下节点

<modules runAllManagedModulesForAllRequests=true>  
    <remove name=WebDAVMsodule />  
</modules>
<handlers>
    <remove name=WebDAV />
</handlers>

二、.net CORS 服务端处理跨域

CORS 跨域资源共享(Cross-origin resource sharing)

同源策略是浏览器的安全基石之一,禁止不同域javascript脚本进行交互,当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同(跨域具体错误可以查看浏览器报错信息)

方法一、代理服务器处理

1、Nginx代理服务器

#proxy服务器
server {
    listen       7960;
    server_name  localhost;
    location / {
        proxy_pass    http://localhost:7850;
        #允许跨域请求域
        add_header Access-Control-Allow-Origin *;
        #允许请求的方式
        add_header Access-Control-Allow-Methods *;#get、post、put、delete
        #允许请求的header
        add_header Access-Control-Allow-Headers *;
        #如果有cookie,需允许带cookie并修改cookie中域名
        #add_header Access-Control-Allow-Credentials true;
        #proxy_cookie_domain <源域名> <目标域名>;
    }
}

2、IIS代理服务器

web.config中system.webServer节点添加,如下节点

<httpProtocol>
    <customHeaders>
        <add name=Access-Control-Allow-Methods value=GET,POST,PUT,DELETE,OPTIONS />
        <add name=Access-Control-Allow-Headers value=Content-Type,X-Requested-With,AccesToken,UserAccount />
        <add name=Access-Control-Allow-Origin value=* />
    </customHeaders>
</httpProtocol>

IIS中配置能处理一般跨域问题,但是一般跨域问题不在于代理服务,所以你配置了IIS web.config节点应该也不会生效。

方法二、代码中处理

1、.Net Framework 处理方式

引入 Microsoft.AspNet.Cors nuget包

//App_Start文件夹中配置WebApiConfig,代码如下
//HttpConfiguration config
config.EnableCors(new EnableCorsAttribute(*, *, *)
{ 
    SupportsCredentials = true 
});

2、.net 处理方式

官网文档-跨源请求 (CORS)

    const string AllowSpecificOrigins="allowSpecificOrigins;";
public void ConfigureServices(IServiceCollection services)
{
    //...
    builder.Services.AddCors(options=>options.AddPolicy(AllowSpecificOrigins, policy=>
                policy.AllowAnyOrigin()
                      .AllowAnyHeader()
                      .AllowAnyMethod()));
    //...
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    //...
    app.UseCors(AllowSpecificOrigins);
    //...
}

三、添加自定义header后提示跨域

​ nginx代理接口,发布上线后添加跨域配置还是提示跨域,移除自定义header后访问正常,添加自定义header后提示跨域。

​ 原因:添加自定义header会导致发送ajax浏览器先发送一个预检请求(OPTIONS),后端没有对预检请求中的数据进行校验,所以是不会通过的,从而导致后续的实际请求无法发送,浏览器就会认为不允许跨域。

通过修改代理配置响应预检请求如下

...
location / {
    if ($request_method = 'OPTIONS') {
        add_header Access-Control-Allow-Origin '*';
        add_header Access-Control-Allow-Headers '*';
        add_header Access-Control-Allow-Methods '*';
        #是否携带Cookie,该设置为 true 时 Allow-Origin 不可为 '*'
        #add_header Access-Control-Allow-Credentials true;
        add_header Content-Length 0;
        return 204;
    }
}
...
烂柯