一、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 处理方式
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;
}
}
...
Comments NOTHING