Take the 2-minute tour ×
Super User is a question and answer site for computer enthusiasts and power users. It's 100% free, no registration required.

I have a web server on my LAN with the URL https://10.0.0.22 and I am trying to access it from the internet through an nginx reverse proxy with a URL like https://domain.com/my/web/app.

The difficulty I'm having is that the local server sends a 302 redirect to /login.php, which nginx then passes back to the external client's browser to become https://domain.com/login.php instead of https://domain.com/my/web/app/login.php. This results in a 404 error because there's nothing at https://domain.com/login.php.

I have tried many different options with little success, including a wide range of rewrite, proxy_redirect, and proxy_buffering directives, but this is as close as I can get it:

    location ^~ /my/web/app/
    {
            proxy_buffering   off;
            rewrite           /my/web/app/(.*) /$1 break;
            proxy_pass        https://10.0.0.22/;
    }

Is there a way to configure nginx so that the internal web server's 302 redirect to /login.php manifests externally as /my/web/app/login.php?

share|improve this question
    
This might help, but I have not tried it: stackoverflow.com/questions/695630/… –  Jens Dec 18 '13 at 16:25
add comment

1 Answer

up vote 2 down vote accepted

After continued investigation and testing of different combinations and ordering of directives, adding proxy_redirect after the proxy_pass directive seems to fix the URI translation issue:

 proxy_redirect https://10.0.0.22/ https://domain.com/my/web/app/;

After some more tinkering, it seems that setting proxy_redirect to default does the same thing implicitly:

 proxy_redirect default;

The full location block then looked like this:

location ^~ /my/web/app/
{
        proxy_buffering   off;
        rewrite           /my/web/app/(.*) /$1 break;
        proxy_pass        https://10.0.0.22/;
        #proxy_redirect    https://10.0.0.22/ https://domain.com/my/web/app/;
        proxy_redirect    default;
}

Images were still broken, however, because they point to /images on the local server. I'm not sure of how to get nginx to translate those (because they're embedded in the HTML body) but to work around the problem for now, I was able to add a dedicated location block for /images before the location block for /my/web/app, like this:

    location ^~ /images/
    {
            proxy_pass https://10.0.0.22/images/;
            proxy_redirect default;
    } 
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.