首页 > 解决方案 > 使用 gurnt-connect-proxy 代理到 cloudfront 得到 403 错误

问题描述

我曾经将grunt-connect-proxy某些页面反向代理到我的 CloudFront 网站,但它无法正常工作。

环境:

我试过的

  1. 使用http-proxy成功):
httpProxy.createProxyServer({target: {
  protocol: 'http:',
  host: 'myhostname.com',
  port: 80,
},
headers: {
  host: 'myhostname.com'
}}).listen(8080)
  1. 使用curl成功):
curl -v http://myhostname.com/signin
  1. 使用Nginx成功):
location ~* ^/(signin|styles|scripts) {
  proxy_pass http://myhostname.com;
}

使用grunt-connect-proxy失败

connect: {
  server: {
    options: {
      open: true,
        base: ['app'],
          middleware: function(connect, options, middlewares) {
            if (!Array.isArray(options.base)) {
              options.base = [options.base];
            }
            middlewares.push(modRewrite([
              '^\\/customer-portal\\/((?!\\.).)*$ /index.html'
            ]));
            middlewares.push(connect.static(options.base[0]));
            middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest)
            return middlewares;
          }
    },
    proxies: [{
      context: ['/signin', '/scripts', '/styles'],
      host: 'myhostname.com',
      port: '80',
      https: false,
    }]
  },
}

它从 CloudFront 获取 403 代码(我不确定 CloudFront 中的 403 是否为 404)。如果我headers添加proxies

proxies: [{
 ...
  headers: {
    'host': 'myhostname.com'
  }
 ...
}]

ERR_CONTENT_DECODING_FAILED从铬得到错误。那么,正确的配置是什么?

标签: javascriptproxygruntjsamazon-cloudfront

解决方案


我已经通过客户中间件解决了这个问题http-proxy,已经放弃使用grunt-connect-proxy,代码如下:

middlewares.push(function(req, res, next) {
  if(someRegex.test(req.url) {
    proxy.web(req, res, {target: 'myhostname.com'})
  } else {
    return next();
  }
})

推荐阅读