29
    location /product {
        proxy_pass http://10.0.0.25:8080;
    }

if I use my first location description for product folder, I should use http://mysdomain.com/product/ and I can not use http://mysdomain.com/product from browser. I mean I should use a slash end of url. I want to access product folder with two stuation.

is there s difference between this:

    location /product/ {
        proxy_pass http://10.0.0.25:8080;
    }
barteloma
  • 399

3 Answers3

26

These locations are different. First one will match /production for example, that might be not what you expected. So I prefer to use locations with a trailing slash.

Also, note that:

If a location is defined by a prefix string that ends with the slash character, and requests are processed by one of proxy_pass, fastcgi_pass, uwsgi_pass, scgi_pass, or memcached_pass, then in response to a request with URI equal to this string, but without the trailing slash, a permanent redirect with the code 301 will be returned to the requested URI with the slash appended.

If you have something like:

location /product/ {
    proxy_pass http://backend;
}

and go to http://example.com/product, nginx will automatically redirect you to http://example.com/product/.

Even if you don't use one of these directives above, you could always do the redirect manually:

location = /product {
    rewrite ^ /product/ permanent;
}

or, if you don't want redirect you could use:

location = /product {
    proxy_pass http://backend;
}
Alexey Ten
  • 9,247
8

No, these are not the same--you will need to use a trailing slash with a regex to match both, i.e.

location ~ /product/?

See this related answer for a more detailed response on how to match the entire URL.

Andrew M.
  • 11,412
0

Short version of the accepted answer:

When you use location /product:

  • GET /product will get a 301 redirect to /product/
  • GET /product/ goes to proxy_pass

If you don't want the redirect, use location /product/:

  • GET /product will give 404
  • GET /product/ still goes to proxy_pass

Docs for the location directive:

In response to a request with URI equal to this string, but without the trailing slash, a permanent redirect with the code 301 will be returned to the requested URI with the slash appended. If this is not desired, an exact match of the URI and location could be defined like this:

location /user/ {
    proxy_pass http://user.example.com;
}

location = /user { proxy_pass http://login.example.com; }

This example has no redirect, both /user and /user/ are aliases

kolypto
  • 11,588