如何在nginx中更改代理服务器响应的状态代码?

时间:2017-01-10 02:13:58

标签: nginx proxy proxypass

我很难配置nginx作为公共S3端点的代理。我的用例需要更改S3响应的状态代码,同时保留响应有效负载。

S3返回的可能状态代码包括200和403.对于我的用例,我需要将这些状态代码映射到503。

我尝试了以下不起作用:

location ~* ^/.* {
  [...]
  proxy_intercept_errors on;
  error_page             200 =503 $upstream_http_location
}

Nginx输出以下错误:

  

nginx:[emerg]值“200”必须介于300和599之间/etc/nginx/nginx.conf:xx

这是一个更完整的代码段:

server {
  listen       80;

  location ~* ^/.* {
    proxy_http_version         1.1;
    proxy_method               GET;
    proxy_pass                 http://my-s3-bucket-endpoint;
    proxy_pass_request_body    off;

    proxy_set_header       Content-Length "";
    proxy_set_header       Connection "";
    proxy_set_header       Host my-s3-bucket-endpoint;
    proxy_set_header       Authorization '';

    proxy_hide_header      x-amz-id-2;
    proxy_hide_header      x-amz-request-id;
    proxy_hide_header      Set-Cookie;
    proxy_ignore_headers   "Set-Cookie";

    proxy_cache            S3_CACHE;
    proxy_cache_valid      200 403 503 1h;
    proxy_cache_bypass     $http_cache_purge;
    add_header             X-Cached $upstream_cache_status;

    proxy_intercept_errors on;
    error_page             200 =503 $upstream_http_location;
  }
}

是否有可能通过nginx实现我的需求?

1 个答案:

答案 0 :(得分:2)

我找到了一个或多或少合适的解决方案。它有点hackish但它有效。

关键是将我的S3存储桶的索引文档设置为不存在的文件名。这会导致对S3存储桶端点的请求导致403.

由于nginx代理将所有传入请求映射到S3存储桶端点/上,因此结果总是403,nginx代理可以拦截。从那里,error_page指令通过请求S3存储桶端点中的特定文档(在本例中为 error.json )并使用503作为响应状态代码来响应它。

location ~* ^/. {
  proxy_intercept_errors on;
  error_page             403 =503 /error.json;
}

此解决方案涉及将两个请求发送到S3存储区端点(/,/ error.json),但至少使用上面更完整的代码段中的配置为两个请求启用了缓存。