nginx and trailing slash with proxy pass

17,284

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.

Share:
17,284
Serafeim
Author by

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, 2022

Comments

  • Serafeim
    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 visit http://correct.name.gr:8000/test/register/asd I get correct results (404 from apache). When I visit http://correct.name.gr:8000/test/asd I get correct results (404 from nginx). When I visit http://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 to http://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 correct http://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
    Serafeim almost 11 years
    No I did not try playing with that... I will tomorrow - however take a look at the update pls
  • vreen
    vreen almost 11 years
    Just 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
    Serafeim almost 11 years
    Yes, very nice comment... Curl FTW !