29

Given the following configuration of nginx:

server {
    listen  80;
    server_name apilocal;
    sub_filter  "apiupstream/api" "apilocal";
    sub_filter_once off;
    location /people/ {
            proxy_pass  http://apiupstream/api/people/;
            proxy_set_header Accept-Encoding "";
    }
}

Sub_filter does not properly response parts of the response. Once I remove proxy_pass from the configuration, it works properly. A lot of folks with this problem end up having gzip compression from the upstream server. I've verified that my upstream server does not have gzip encoding turned on for its responses. But just in case, I've also used the proxy_set_header above to not accept gzip.

Is there potentially something else I'm missing?

5 Answers 5

20
+50

Your response probably has other content-type than defined in sub_filter_types by default.

Reference: http://nginx.org/r/sub_filter_types

3
  • 36
    I didn't have proxy_set_header Accept-Encoding ""; you need that to tell the backend that compression isn't allowed in a response. Oct 7, 2014 at 3:19
  • 3
    Original answer should be edited to include @JamesTSnell comment, without which the answer is useless.
    – HeadCode
    Mar 16, 2018 at 1:00
  • How to tell the backend that compression isn't allowed in a response?? Dec 14, 2021 at 21:05
20

James T Snell answered it in a comment:

I didn't have proxy_set_header Accept-Encoding ""; you need that to tell the backend that compression isn't allowed in a response.

1

does it need to be inside a location block? also, maybe no quotes on match arg?

http://wiki.nginx.org/HttpSubModule

location / {   sub_filter      
      </head>   
      '</head><script
      language="javascript" src="$script"></script>';   
      sub_filter_once on;
}
1

make sure precompression is not activated:, otherwise it will not work because sub_filter is executed on the zipped data

server {
    gzip_static off;
}
1
  • As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
    – Community Bot
    Apr 5, 2022 at 6:19
0

Using ingress controller on top of kubernetes, this is how i fixed it:

    nginx.ingress.kubernetes.io/configuration-snippet: |
      proxy_set_header Accept-Encoding "";
      sub_filter_once off;
      sub_filter_types *;
      sub_filter 'http:' 'https:';

But i restricted that to PATHs that requires that substituation:

spec:
  rules:
  - host: xyz.company.local
    http:
      paths:
      - pathType: Exact
        path: /my-exact-path
        backend:
          # ...

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .