Why 301 permanent redirect with appended slash?

Francis Daly francis at daoine.org
Wed Jul 31 12:05:27 UTC 2019

On Tue, Jul 30, 2019 at 05:12:01PM -0500, J. Lewis Muir wrote:

Hi there,

> I have a minimal nginx.conf with one server block that sets the root
> directory and one location with a prefix string of "/foo/", and for a
> request of "/foo", it returns a 301 permanent redirect to "/foo/".  Why?
> I expected it to return 404 or similar.  I also tried a prefix string of
> "/foo", but that also results in the same 301.

I get a 301 if the directory "foo" exists; and a 404 if it does not.

Do you get something different?

> But in my case, I don't believe the request is being processed by any of
> those *_pass directives.

If you request "/directory", and "directory" exists, then the filesystem
handler will issue a 301 to "/directory/", which I think is what you
are seeing.

As in: your request for "/foo" does not match any location{}, and so is
handled at server-level, which runs the filesystem handler and returns
200 if the file "foo" exists, 301 if the directory "foo" exists, and
404 otherwise.

Change your config to be

  location /foo/ { return 200 "location /foo/\n"; }

and you will see when that location is used.

If your config has

  location /foo {}

then a similar consideration applies, except the request "/foo" is now
handled in that location which, per the above configuration, uses the
filesystem handler.

Francis Daly        francis at daoine.org

More information about the nginx mailing list