Trailing Slash Redirect Loop Help

Francis Daly francis at
Wed Oct 9 21:33:08 UTC 2019

On Wed, Oct 09, 2019 at 01:54:58PM -0400, Alex Med wrote:

Hi there,

> Here is the full configuration with reverse proxy, pagespeed,and
> lowercasing. It all
> works well, but now that I incorporated removing the trailing slash it
> brought up new
> issues:  Let me know if you prefer that I
> post the configurations
> in the post.

Thanks for this.

Some of this configuration is not "stock nginx", but I guess that the
extra modules do not affect the issue here.

It would be convenient for history here, to have the config here; but
the relevant part is basically the part shown in the previous mail.

Most requests eventually use a proxy_pass to an upstream server.

> This is with the "evil if" enable, I get the following response when it is a
> directory such as the blog directory:

I suspect that there may be an interpretation issue here.

When I read "the blog directory", I understand something along the lines
of "/usr/local/nginx/html/blog/index.html exists as a file that nginx
can see".

I now suspect that you intend something like "the upstream server
considers it to be a directory".

> curl -i
> HTTP/1.1 301 Moved Permanently
> Server: nginx
> Date: Wed, 09 Oct 2019 15:06:04 GMT
> Content-Type: text/html
> Content-Length: 178
> Location:
> Connection: keep-alive

That's from nginx; your config says "if the request ends in / and does
not represent a directory on this filesystem, redirect to no-slash".

> curl -i
> HTTP/1.1 301 
> Server: nginx
> Date: Wed, 09 Oct 2019 15:06:48 GMT
> Content-Length: 0
> Connection: keep-alive
> Location: /blog/
> Cache-Control: s-maxage=10

That's from your upstream server. Presumably it has decided that "/blog
refers to a directory as far as it is concerned; please request /blog/

And there is your infinite loop.

So I guess the next question is: what response do you want from nginx?

In this specific case: when you request /blog/, how would you like nginx
to handle that request?

And in your answer, also consider: how might nginx possibly be able
to tell that you want the request handled differently from a request
for /file/?

> >>Does the proxy_pass upstream
> >>share the same filesystem as this nginx?
> No, they do not share the same file system.

"if -d" looks on the filesystem. try_files looks on the filesystem.

If the filesystem does not contain the information on whether "this"
thing is a directory or not, looking on the filesystem will not be able
to give a useful answer.

So, what specific problem are you trying to solve?

If you remove the "remove the slash" configuration from nginx, is there
one request that gets a response that you do not want?

Perhaps fixing the handling of *that* request will get you to a config
that does what you want.

Francis Daly        francis at

More information about the nginx mailing list