Search code examples
nginxproxywebserverreverse-proxy

proxying relative urls with nginx


My question is similar to Nginx Relative URL to Absolute Rewrite Rule? - but with an added twist.

I have nginx acting as a proxy server, which proxies for multiple apps, similar to this (simplified) config:

server {
  listen 80;
  server_name example.com;

  location /app1 {
    proxy_pass   http://app1.com;
  }
  location /app2 {
    proxy_pass http://app2.com;
  }
}

This works fine, but as in the other question, these applications (app1 and app2) use relative urls such as /css/foo.css, or /js/bar.js. Also it's a big problem to ask all applications to change to something like /app1/css/foo.css.

Is it possible for nginx to intelligently figure out which application should handle the request? FTR, users would be accessing these applications like this:

http://example.com/app1/fooaction or http://example.com/app2/baraction.

If it matters, all applications are Java/Tomcat based apps.

TIA!


Solution

  • Based on your updated comments; if the upstream backend sends the referer header, you could do something like this:

    location ~* ^/(css|js)/.+\.(css|js)$ {            
            #checking if referer is from app1            
            if ($http_referer ~ "^.*/app1"){
                return 417;
            }    
    
            #checking if referer is from app2
            if ($http_referer ~ "^.*/app2"){
                return 418;
            }    
        }
        error_page   417  /app1$request_uri;
        error_page   418  /app2$request_uri;
    
    
        location /app1 {        
             proxy_pass  http://app1.com;
        }
    
        location /app2 {
            proxy_pass http://app2.com;
        }
    

    For example, if the backend on app2.com, requests the test.css like this:

    curl 'http://example.com/css/test.css' -H 'Referer: http://app2.com/app2/some/api'
    

    The request land here:

    /app2/css/test.css