How to add headers in nginx only sometimes

后端 未结 2 1366
小鲜肉
小鲜肉 2020-12-29 11:31

I have a nginx proxy to a API server. The API sometimes sets the cache control header. If the API hasnt set the cache control I want nginx to override it.

How do I d

相关标签:
2条回答
  • 2020-12-29 12:08

    You cannot use if here, because if, being a part of the rewrite module, is evaluated at a very early stage of the request processing, way before proxy_pass is called and the header is returned from the upstream server.

    One way to solve your problem is to use map directive. Variables defined with map are evaluated only when they are used, which is exactly what you need here. Sketchily, your configuration in this case would look like this:

    # When the $custom_cache_control variable is being addressed
    # look up the value of the Cache-Control header held in
    # the $upstream_http_cache_control variable
    map $upstream_http_cache_control $custom_cache_control {
    
        # Set the $custom_cache_control variable with the original
        # response header from the upstream server if it consists
        # of at least one character (. is a regular expression)
        "~."          $upstream_http_cache_control;
    
        # Otherwise set it with this value
        default       "no-store, no-cache, private";
    }
    
    server {
        ...
        location /api {
            proxy_pass $apiPath;
    
            # Prevent sending the original response header to the client
            # in order to avoid unnecessary duplication
            proxy_hide_header Cache-Control;
    
            # Evaluate and send the right header
            add_header Cache-Control $custom_cache_control;
        }
        ...
    }
    
    0 讨论(0)
  • 2020-12-29 12:09

    Awswer from Ivan Tsirulev is correct but you don't have to use regex.

    Nginx uses the first parameter of map as default value automatically so you don't have to add that either.

    # Get value from Http-Cache-Control header but override it when it's empty
    map $upstream_http_cache_control $custom_cache_control {
        '' "no-store, no-cache, private";
    }
    
    server {
        ...
        location /api {
            # Use the value from map
            add_header Cache-Control $custom_cache_control;
        }
        ...
    }
    
    0 讨论(0)
提交回复
热议问题