我在向其他域上的Web API发出PUT和DELETE CORS请求时遇到一些麻烦.
我已经通过http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api#create-webapi-project教程对API进行了编码.
GET和POST请求工作正常,但DELETE和PUT没有.我收到这条消息:
Failed to load resource: the server responded with a status of 405 (Method Not Allowed)
Failed to load resource: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Run Code Online (Sandbox Code Playgroud)
当我在使用ASP.NET Web API的CORS支持PUT和DELETE时向WebConfig添加代码时,我只得到第一个错误.
有人可以帮我这个吗?
我正在使用Go gin框架杜松子酒
func CORSMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
c.Writer.Header().Set("Content-Type", "application/json")
c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
c.Writer.Header().Set("Access-Control-Max-Age", "86400")
c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE, UPDATE")
c.Writer.Header().Set("Access-Control-Allow-Headers", "Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization, X-Max")
c.Writer.Header().Set("Access-Control-Allow-Credentials", "true")
if c.Request.Method == "OPTIONS" {
c.AbortWithStatus(200)
} else {
c.Next()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有状态码:200 OK,但OPTIONS请求后没有任何反应.看起来我想念一些东西,但我无法理解我错在哪里.
有谁能够帮我?
我已按照此步骤设置我的服务器以启用CORS. https://docs.microsoft.com/en-us/aspnet/web-api/overview/security/enabling-cross-origin-requests-in-web-api
但现在在我的浏览器开发控制台中,我看到此错误消息:
XMLHttpRequest无法加载https:// serveraddress/abc.预检的响应无效(重定向)
你知道我该怎么做才能修好它?我在HTTPS中发出CORS请求.我认为这导致'预检无效(重定向)'失败.但我不知道为什么或什么是重定向OPTIONS请求.
谢谢.
通过我的NGinx设置,我能够拦截来自ajax预检的OPTIONS请求,并使用正确的CORS标头和200响应进行响应,以便请求可以继续进行.我正在尝试将我的前端代理合并到HAProxy中,并且在解决这个难题时遇到了一些问题.
我的特殊问题是,当有服务器能够正确响应OPTIONS请求时,我能够添加正确的CORS选项,但是当发出预检请求时,一些后端无法处理/响应405错误.我的haproxy.cfg包含以下用于添加标题的行:
capture request header origin len 128
http-response add-header Access-Control-Allow-Origin %[capture.req.hdr(0)] if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Credentials:\ true if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Headers:\ Origin,\ X-Requested-With,\ Content-Type,\ Origin,\ User-Agent,\ If-Modified-Since,\ Cache-Control,\ Accept if { capture.req.hdr(0) -m found }
rspadd Access-Control-Allow-Methods:\ GET,\ POST,\ PUT,\ DELETE,\ OPTIONS if { capture.req.hdr(0) -m found }
rspadd Access-Control-Max-Age:\ 1728000 if { capture.req.hdr(0) -m found }
Run Code Online (Sandbox Code Playgroud)
解决方案:
当您从客户端的请求设置所有正确的标头时,如何在不将请求传递给Web服务器的情况下使用HAProxy发送响应,但不是动态的,这不是理想的解决方案.
任何帮助,将不胜感激!
我正在开发一个Web应用程序.它使用基本身份验证.它必须处理OPTIONS请求.这些是Web浏览器预检请求以及来自WebDAV客户端的功能支持请求.
据我所知,OPTIONS请求必须在不请求身份验证的情况下处理(即我的服务器不应该响应401 Unauthorized),它必须给出如下响应:
OPTIONS https://localhost:44305/path/file.ext HTTP/1.1
Connection: Keep-Alive
User-Agent: some app
Host: localhost:44305
HTTP/1.1 200 OK
Content-Length: 0
DAV: 1, 2, 3
Date: Fri, 27 Dec 2013 17:10:21 GMT
Run Code Online (Sandbox Code Playgroud)
我的问题是:我是否应该始终对OPTIONS请求提供相同的响应,无论URL是什么,还是应该依赖于URL.
例如,如果找不到上例中的file.ext,我应该回复'404 Not found'还是'200 OK'?
我有一个ASP.NET Web API,由三个不同的SPA调用.我正在为Web API使用Windows身份验证.我最初尝试在Web.config中配置CORS,如下所示:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:63342" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
Run Code Online (Sandbox Code Playgroud)
这导致了这个预检问题:
Response to preflight request doesn’t pass access control check: No ‘Access-Control-Allow-Origin’ header is present on the requested resource. Origin (...) is therefore not allowed access.
Run Code Online (Sandbox Code Playgroud)
我通过在Global.asax.cs中添加以下方法解决了:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
Run Code Online (Sandbox Code Playgroud)
这种方法适用于单一SPA.我以为我可以去Web.config并添加其他类似的来源:
<add name="Access-Control-Allow-Origin" value="http://localhost:63342,http://localhost:63347,http://localhost:63345/>
Run Code Online (Sandbox Code Playgroud)
但显然这是不允许的.这产生了以下错误:
The 'Access-Control-Allow-Origin' header contains …Run Code Online (Sandbox Code Playgroud) 我有一个使用 axios 发出 http 请求的 Vue 前端,以及一个使用express 的 Node 后端。它们位于不同的域(本地运行时,BE端口为3080,FE端口为3000),我在Node后端使用cors库来处理CORS问题。尽管预检工作正常,post 请求仍然失败并出现 CORS 错误!
当我发送 post 请求时,浏览器会收到预检请求的漂亮的 204 成功响应,并包含这些漂亮的成功标头:
Access-Control-Allow-Headers: content-type
Access-Control-Allow-Methods: POST
Access-Control-Allow-Origin: http://localhost:3000
Connection: keep-alive
Content-Length: 0
Date: Thu, 21 Apr 2022 03:25:54 GMT
Keep-Alive: timeout=5
Vary: Origin, Access-Control-Request-Headers
X-Powered-By: Express
Run Code Online (Sandbox Code Playgroud)
那么为什么我的 POST 请求仍然失败并出现 CORS 错误?
不知道这是否相关,但可能是:我已经在 Brave(基于铬)和 Firefox 中尝试过这一点。两者具有相同的基本结果,但有一个区别:在 Brave 开发工具中,似乎显示首先发送 POST 请求,然后发送预检 OPTIONS 请求。这看起来像是一个明显的危险信号,但是......在 Firefox 中,开发工具显示首先发送预检选项,然后发送 POST。但正如我所说,预检成功,发布失败,并在两个浏览器中出现 CORS 错误。
后端代码
应用程序.js:
const express = require('express');
const cors = require('cors');
const app = …Run Code Online (Sandbox Code Playgroud) 我刚刚发现我的浏览器在尝试使用自定义http标头进行跨域ajax调用时发送了一个额外的"OPTION"请求.我认为它被称为"预检请求".
是否可以禁用此功能并发送初始请求?
这是我的javascript测试代码:
$(document).ready(function() {
$.ajax({
url: "http://google.fr",
crossDomain: true,
headers: {
"X-custom-parameter": true
}
});
});
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助!
我正在阅读关于CORS请求的规范,我发现了有关预检请求的内容:
这些是对具有除GET之外的HTTP请求方法的非同一原始URL的请求,首先需要使用预检结果缓存条目或预检请求进行授权.
我曾经认为预检请求的目的是在创建请求之前检查是否允许请求,以防它(非法)更改服务器状态.
但是HEAD和OPTIONS不会修改服务器状态.我必须误解预检检查的原因.
为HEAD和OPTIONS进行预检检查但不是GET的目的(也就是原因,动机或理由)是什么?GET有什么特别之处?
我正在尝试使用签名 URL 从前端通过 fetch 上传到 GCP,但遇到了持续存在的 CORS 问题。
要上传的文件是否应该嵌入到signedurl中,或者发送到请求正文中的signedurl?
这是错误:
Access to fetch at <signedurl> from origin 'http://my.domain.com:3000' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
这是存储桶上的 CORS 配置:
[
{
"origin": ["http://gcs.wuddit.com:3000"],
"responseHeader": ["Content-Type", "Authorization", "Content-Length", "User-Agent", "x-goog-resumable", "Access-Control-Allow-Origin"],
"method": ["GET", "POST", "PUT", "DELETE"],
"maxAgeSeconds": 3600
}
]
Run Code Online (Sandbox Code Playgroud)
这是获取调用:
const uploadHandler = async (theFile, signedUrl) => {
try {
const response …Run Code Online (Sandbox Code Playgroud) cors preflight pre-signed-url google-cloud-platform fetch-api
preflight ×10
cors ×7
ajax ×2
cross-domain ×2
.net ×1
asp.net ×1
axios ×1
fetch-api ×1
frameworks ×1
go ×1
go-gin ×1
haproxy ×1
http ×1
http-delete ×1
http-headers ×1
http-method ×1
node.js ×1
option ×1
vue.js ×1