由于 CORS,Nginx 反向代理后面的 Golang 应用程序不会接受 ajax 请求

Posted

技术标签:

【中文标题】由于 CORS,Nginx 反向代理后面的 Golang 应用程序不会接受 ajax 请求【英文标题】:Golang app behind Nginx reverse proxy won't accept ajax request on firefox due to CORS 【发布时间】:2015-03-27 21:05:39 【问题描述】:

所以我有一个域名,它是一个静态 html 文件,它向反向代理中位于 nginx 后面的子域应用程序发送 ajax 请求。

这是我的 ajax 代码:

$(document).ready(function()
  function call() 
    $.ajax(
      type: "POST",
      url: "https://test.example.com/call",
      crossDomain: true,
      data: $("#form-call").serialize(),
      success: function(response) 
        $("#response").html(response);
      ,
      error: function() 
        alert("error");
      

);

在 Nginx 上我有:

    upstream example 
         server 192.168.1.10:6000;
    
    server 

        listen 443;
        server_name test.example.com;
        ssl on;
        ssl_certificate /etc/nginx/ssl/afs.crt;
        ssl_certificate_key /etc/nginx/ssl/afs.key;
        proxy_set_header Host             $http_host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header Authorization    "";

        client_max_body_size 0;

        chunked_transfer_encoding on;
        add_header 'Access-Control-Allow-Origin' "$http_origin";


        location / 
            proxy_pass https://exapmle;
            proxy_read_timeout 900;
        
    

我在我的 golang 应用上有这个来帮助处理 CORS:

func (s *MyServer) ServeHTTP(rw http.ResponseWriter, req *http.Request) 
    if origin := req.Header.Get("Origin"); origin != "" 
        rw.Header().Set("Access-Control-Allow-Origin", origin)
        rw.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
        rw.Header().Set("Access-Control-Allow-Headers",
            "Accept, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
    
    // Stop here if its Preflighted OPTIONS request
    if req.Method == "OPTIONS" 
        return
    
    // Lets Gorilla work
    s.r.ServeHTTP(rw, req)

它在 chrome 上运行良好,但在 firefox 上出现错误:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://test.example.com/call. This can be fixed by moving the resource to the same domain or enabling CORS.

【问题讨论】:

查询到底是什么?错误消息似乎很清楚需要做什么。 好吧,从我读到的,我已经在 golang 应用程序中启用了 CORS。我还通过代理转发了标头,所以它不应该仍然给出这个错误,但它是。 ServeHTTP 是否真的得到了 Firefox 的请求?这很可能是 https 证书问题。 【参考方案1】:

免责声明:我刚刚看到这篇文章有多老了,我想问题已经解决了。

这对我有用:

func corsHandler(fn http.HandleFunc) http.HandleFunc 
    return func(rw http.ResponseWriter, req *http.Request) 
        rw.Header().Set("Access-Control-Allow-Origin", "*")
        fn(rw, req)
    

那么在设置路由器时,您可以:

r := mux.NewRouter()
r.HandleFunc("/<route>", corsHandler(handleRouteMethod)).Methods("<METHOD>")

略有不同的方法,但它确实有效,所以如果所有其他方法都失败了,你可以试一试(假设你使用的是 gorilla mux,如果你使用的是 httprouter 或其他东西,那么你的 corsHandler 方法可能需要使用不同的函数签名)。

【讨论】:

以上是关于由于 CORS,Nginx 反向代理后面的 Golang 应用程序不会接受 ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

CORS跨域与Nginx反向代理跨域优劣对比

带有反向代理 Nginx 服务器和 nodejs 的 CORS 将不起作用

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持

ini 示例Nginx配置,用于为反向代理API添加跨源资源共享(CORS)支持