由于CORS,Nginx反向代理背后的Golang应用程序不能接受firefox上的ajax请求

时间:2015-01-28 19:52:29

标签: ajax nginx go proxy cors

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

这是我的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.

1 个答案:

答案 0 :(得分:0)

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

这对我有用:

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方法可能需要使用一个不同的功能签名)。