2014-12-02 15 views
5

Meine Frage ist ähnlich wie Nginx Relative URL to Absolute Rewrite Rule? - aber mit einem zusätzlichen Twist.Proxying relative URLs mit Nginx

Ich habe nginx als Proxy-Server fungiert, die für mehrere Anwendungen, ähnlich wie diese (vereinfacht) Config-Proxies:

server { 
    listen 80; 
    server_name example.com; 

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

Dies funktioniert gut, aber wie in der anderen Frage, diese Anwendungen (app1 und app2) verwenden Sie relative URLs wie /css/foo.css oder /js/bar.js. Auch ist es ein großes Problem, alle Anwendungen zu bitten, zu etwas wie /app1/css/foo.css zu ändern.

Kann nginx intelligent herausfinden, welche Anwendung die Anfrage verarbeiten soll? FTR, Benutzer würden auf diese Anwendungen wie folgt zugreifen:

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

Wenn es darauf ankommt, sind alle Anwendungen Java/Tomcat-basierte Anwendungen.

TIA!

+0

können Sie ein wenig mehr klären, was Sie erreichen wollen? Möchten Sie die Anfrage "/css/foo.css" an app1 und "/js/bar.js" an app2 übergeben? – danielgpm

+0

Ja. Wenn app1 /css/foo.css anfordert, sollte es an app1.com/css/foo.css weitergeleitet werden. Wenn app2 nach /js/bar.js fragt, sollte es an app2.com/js/bar.js weitergeleitet werden. – ragebiswas

Antwort

7

Basierend auf Ihren aktualisierten Kommentaren; wenn der Upstream-Backend sendet den Referer-Header, könnten Sie so etwas tun:

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; 
    } 

Zum Beispiel, wenn das Backend auf app2.com, die test.css wie dies fordert:

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

Die Anfrage Land hier:

/app2/css/test.css 
+1

Ich glaube nicht, dass Sie meine Frage klar beantwortet haben. Wenn app1 nach '/ css/foo.css' fragt, sollte es zu' http: // app1.com/css/foo.css' umleiten. Wenn app2 jedoch nach '/ css/foo.css' fragt, sollte es zu' http: // app2.com/css/foo.css' gehen. – ragebiswas

+0

dann wie 'app1' und' app2' in der Anfrage identifiziert werden? Durch Benutzer-Agent? Header (Referrer?) oder ein Anfrageparameter? Bitte geben Sie weitere Details ... – danielgpm

+1

Sorry, wenn ich nicht klar bin. App1 wird nach Standort identifiziert. Also würden Benutzer 'example.com/app1/fooservice' eingeben. ABER die nachgeschaltete Anwendung für app1 verwendet relative URLs für Ressourcen wie '/ css/bar.css' und NOT'/app1/css/bar.css'. Ist das Problem jetzt klar? FWIW Eine Lösung von nginx allein ist hier möglicherweise nicht möglich. – ragebiswas