nginx and trailing slash with proxy pass
Solution 1
My guess is that your upstream server (either apache or your script) triggered a redirect to the absolute url http://localhost/test/register/
. Because you use http://127.0.0.1
in your proxy_pass
directive, nginx doesn't find a match of the domain name and returns the Location
header as is.
I think the right solution is to NOT use absolute redirect if the redirect is to an internal url. This is always a good practice.
However, without changing upstream server, there are two quick solutions.
you can use
proxy_pass http://localhost;
This will tell nginx the domain name of upstream is localhost
. Then nginx will know to replace http://localhost
by http://correct.name.gr:8000
when it finds that part in the Location
header from upstream.
Another one is to add a proxy_redirect
line to force nginx to rewrite any location header with http://localhost/
in it.
proxy_pass http://127.0.0.1;
proxy_redirect http://localhost/ /;
I prefer to the first solution because it's simpler. There is no DNS lookup overhead of using proxy_pass http://localhost;
because nginx does the lookup in advance when it starts the web server.
reference: http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_redirect
Solution 2
Did you already try playing with server_name_in_redirect?
However, I found you question via google because I run the same issue with the trailing slash. Nginx forces a 301 to the same URL with an trailing slash.
Serafeim
Serafeim S. Papastefanos received his Diploma (2005) and Phd (2010) in EE from the National Technical University of Athens. He has been awarded for his academic progress from State Scholarships Foundation (SSF). His research interests include network management, network protocols, video coding, video indexing and video streaming. Since then he is working as a Software Engineer, starting from automating business processes with the Appian platform (heavy usage of Java/Javascript) and continuing with Django web development. He also keeps a small blog about various programming stuff @ http://spapas.github.io/ SOreadytohelp
Updated on June 10, 2022Comments
-
Serafeim almost 2 years
I am using the following configuration for nginx 1.4.1:
server { listen 8000; server_name correct.name.gr; location /test/register { proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1; } }
What I want to do is when the users vist
http://correct.name.gr:8000/test/register/
they should be proxied to the apache which runs on port 80.When I visit
http://correct.name.gr:8000/test/register/
I get correct results (index.php). When I visithttp://correct.name.gr:8000/test/register/asd
I get correct results (404 from apache). When I visithttp://correct.name.gr:8000/test/asd
I get correct results (404 from nginx). When I visithttp://correct.name.gr:8000/test/register123
I get correct results (404 from apache).The problem is when I visit
http://correct.name.gr:8000/test/register
. I get a 301 response and I am redirected tohttp://localhost/test/register/
(notice the trailing slash and of course the 'localhost')!!!I haven't done any other configurations to nginx to put trailing slashes or something similar. Do you know what is the problem ? I want
http://correct.name.gr:8000/test/register
to work correctly by proxying to apache (or if not possible at least to issue a 404 error and not a redirect to the localhost of the user).Update 1: I tried
http://correct.name.gr:8000/test/register
from a different computer than the one with which I had the bad behavior yesterday.. Well, it worked: I just got a 301 response that pointed me to the correcthttp://correct.name.gr:8000/test/register/
! How is it possible to work from one computer but not from the other (I'm using the same browser-Chrome in both computers)? I will try again tomorrow to test from a third one to see the behavior.Thank you !
-
Serafeim almost 11 yearsNo I did not try playing with that... I will tomorrow - however take a look at the update pls
-
vreen almost 11 yearsJust to avoid any browser caching side effects, I would rather recommend testing these redirects with curl from a shell: "curl -IL correct.name.gr:8000/test/register"
-
Serafeim almost 11 yearsYes, very nice comment... Curl FTW !