Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine 运行中服务器的CORS标头存在问题_Google App Engine_Go_Google Cloud Platform - Fatal编程技术网

Google app engine 运行中服务器的CORS标头存在问题

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

现在,我正在使用标准的library net/http编写一个简单的服务器。服务器放置在docker容器中,并放置在google cloud paltform上。但是当我想从我的第三方React应用程序(位于不同的服务器上)访问服务器时,我总是会得到一个CORS错误

为了在线寻找解决方案,我在代码中添加了一个库,该库旨在解决СORS问题。但是添加一个库并没有帮助。即使在应用之后,服务器也不会向我发送СORS头。我现在有什么代码

主程序包
进口(
控制器“/控制器”
“/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”服务: