Google app engine 运行中服务器的CORS标头存在问题
现在,我正在使用标准的library net/http编写一个简单的服务器。服务器放置在docker容器中,并放置在google cloud paltform上。但是当我想从我的第三方React应用程序(位于不同的服务器上)访问服务器时,我总是会得到一个CORS错误 为了在线寻找解决方案,我在代码中添加了一个库,该库旨在解决СORS问题。但是添加一个库并没有帮助。即使在应用之后,服务器也不会向我发送СORS头。我现在有什么代码Google app engine 运行中服务器的CORS标头存在问题,google-app-engine,go,google-cloud-platform,Google App Engine,Go,Google Cloud Platform,现在,我正在使用标准的library net/http编写一个简单的服务器。服务器放置在docker容器中,并放置在google cloud paltform上。但是当我想从我的第三方React应用程序(位于不同的服务器上)访问服务器时,我总是会得到一个CORS错误 为了在线寻找解决方案,我在代码中添加了一个库,该库旨在解决СORS问题。但是添加一个库并没有帮助。即使在应用之后,服务器也不会向我发送СORS头。我现在有什么代码 主程序包 进口( 控制器“/控制器” “/util” “github
主程序包
进口(
控制器“/控制器”
“/util”
“github.com/gorilla/mux”
“github.com/rs/cors”
“日志”
“net/http”
//“操作系统”
)
//入口点
func main(){
c:=cors.New(cors.Options{
AllowedOriginates:[]字符串{“*”},//所有来源
AllowedMethods:[]字符串{“GET”},//只允许GET,只是一个示例
AllowedHeader:[]字符串{“授权”,“内容类型”},
AllowCredentials:正确,
是的,
})
r:=mux.NewRouter()
//路由器
//实时检查
r、 HandleFunc(“/live”,controller.LiveCheck)
apiRouter:=r.PathPrefix(“/api”).Subrouter()
//药物数据
medicationRouter:=apiRouter.PathPrefix(“/medicage”).Subrouter()
medicationRouter.HandleFunc(“,controller.MedicationHeaderList).Methods(“GET”)
medicationRouter.HandleFunc(“/{id}”,controller.MedicationChildrenList.Methods(“GET”)
medicationRouter.HandleFunc(“/{id}/leafs”,controller.MedicationLeafsList.Methods(“GET”)
medicationRouter.HandleFunc(“/search/”,controller.SearchMedicationList).Methods(“GET”)
medicationRouter.HandleFunc(“/result/{id}”,controller.MedicationSearchResult.Methods(“GET”)
//r、 使用(util.CORS)
apiRouter.Use(util.VerifyToken)
log.Println(http.ListenAndServe(“:8080”,c.Handler(r)))
}
以下是我从浏览器控制台的上升点得到的答案:
Request Method: OPTIONS
Status Code: 200 OK
Remote Address: 35.190.37.37:80
Referrer Policy: no-referrer-when-downgrade
Content-Length: 0
Date: Mon, 10 Jun 2019 22:37:36 GMT
Vary: Origin, Access-Control-Request-Method, Access-Control-Request-Headers
Via: 1.1 google
我还尝试手动设置CORS头,创建一个中间件,但也没有帮助。
提前感谢您的帮助
UPD感谢大家的回答和帮助。一切都变得容易多了。谷歌没有更新我的docker容器,因此我在代码中的所有更改都没有达到预期效果。我在问题描述中给出的代码完美地解决了CORS的问题。这个问题可以认为已经结束。您如何测试这个问题?当浏览器必须发出跨原点请求而飞行前条件失败时,将发送
OPTIONS
请求。此OPTIONS
请求包含一个标头,该标头的值是跨源请求中使用的HTTP方法
我展示了服务器的简化版本,下面是一些示例curl命令和结果
下面的请求工作正常,我已将访问控制请求方法设置为GET
curl -I -X OPTIONS -H "Origin: test.com" -H "Access-Control-Request-Method: GET" http://localhost:8080/
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Date: Tue, 11 Jun 2019 02:20:35 GMT
Content-Length: 0
如果没有访问控制请求方法
标头,以下请求将无法工作。我们的服务器可能对GET
和POST
(等)具有不同的CORS设置,并且我们的服务器无法将这些设置与客户端通信。客户端必须设置访问控制请求方法
头,以便服务器知道如何正确响应
curl -I -X OPTIONS -H "Origin: test.com" http://localhost:8080/
HTTP/1.1 200 OK
Date: Tue, 11 Jun 2019 02:31:12 GMT
Content-Length: 436
Content-Type: text/html; charset=utf-8
你是如何测试这个的?当浏览器必须发出跨原点请求而飞行前条件失败时,将发送OPTIONS
请求。此OPTIONS
请求包含一个标头,该标头的值是跨源请求中使用的HTTP方法
我展示了服务器的简化版本,下面是一些示例curl命令和结果
下面的请求工作正常,我已将访问控制请求方法设置为GET
curl -I -X OPTIONS -H "Origin: test.com" -H "Access-Control-Request-Method: GET" http://localhost:8080/
HTTP/1.1 200 OK
Access-Control-Allow-Credentials: true
Access-Control-Allow-Methods: GET
Access-Control-Allow-Origin: *
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Date: Tue, 11 Jun 2019 02:20:35 GMT
Content-Length: 0
如果没有访问控制请求方法
标头,以下请求将无法工作。我们的服务器可能对GET
和POST
(等)具有不同的CORS设置,并且我们的服务器无法将这些设置与客户端通信。客户端必须设置访问控制请求方法
头,以便服务器知道如何正确响应
curl -I -X OPTIONS -H "Origin: test.com" http://localhost:8080/
HTTP/1.1 200 OK
Date: Tue, 11 Jun 2019 02:31:12 GMT
Content-Length: 436
Content-Type: text/html; charset=utf-8
我也有这个问题。您可以在开发环境中使用此代码
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowCredentials: true,
AllowedHeaders: []string{"Authorization", "Content-Type", "Access-Control-Allow-Origin"},
// Enable Debugging for testing, consider disabling in production
AllowedMethods: []string{"GET", "UPDATE", "PUT", "POST", "DELETE"},
Debug: true,
})
我也有这个问题。您可以在开发环境中使用此代码
c := cors.New(cors.Options{
AllowedOrigins: []string{"*"},
AllowCredentials: true,
AllowedHeaders: []string{"Authorization", "Content-Type", "Access-Control-Allow-Origin"},
// Enable Debugging for testing, consider disabling in production
AllowedMethods: []string{"GET", "UPDATE", "PUT", "POST", "DELETE"},
Debug: true,
})
谢谢你的回答。以下是我从前端发送的标题:访问控制请求标题:授权,内容类型访问控制请求方法:获取来源:http://localhost:3000 推荐人:http://localhost:3000/patients 用户代理:Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/75.0.3770.80 Safari/537.36,您的Docker配置是什么样子的?您的服务器在容器内监听哪个端口?什么端口在internet上公开?您在容器中使用的是Nginx或Apache之类的代理吗?这是我的docekr compose文件版本:“3.3”服务:api:container\u name:“api”build:“./api”端口:-“8080:8080”卷:-'./api:/go/src/app”网络模式:主机
我不使用Apache和Nginx,您能运行相同的curl吗命令(调整适当的IP地址)?或者用邮递员模拟选项/获取请求。谢谢您的回答。以下是我从前端发送的标题:访问控制请求标题:授权,内容类型访问控制请求方法:获取来源:http://localhost:3000 推荐人:http://localhost:3000/patients 用户代理:Mozilla/5.0(X11;Linux x86_64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/75.0.3770.80 Safari/537.36,您的Docker配置是什么样子的?您的服务器在容器内监听哪个端口?什么端口在internet上公开?您是否在容器中使用Nginx或Apache之类的代理?以下是我的docekr compose文件版本:“3.3”服务: