2014-12-02 33 views
5

Moje pytanie jest podobne do Nginx Relative URL to Absolute Rewrite Rule? - ale z dodatkowym akcentem.proxying względne adresy URL z nginx

Mam nginx działające jako serwer proxy, który proxy dla wielu aplikacji, podobny do tego (uproszczony) config:

server { 
    listen 80; 
    server_name example.com; 

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

Działa to dobrze, ale jak w drugim pytaniu tych aplikacji (app1 i app2) użyj względnych adresów URL, takich jak /css/foo.css lub /js/bar.js. Również dużym problemem jest poproszenie wszystkich aplikacji o zmianę na coś takiego jak /app1/css/foo.css.

Czy możliwe jest inteligentne sprawdzenie, która aplikacja powinna obsłużyć żądanie? FTR, użytkownicy mieliby dostęp do takich aplikacji:

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

Jeśli ma to znaczenie, wszystkie aplikacje są oparte na Java/Tomcat.

TIA!

+0

można wyjaśnić trochę więcej, co staramy się osiągnąć? Czy chcesz przekazać żądanie "/css/foo.css" do app1 i "/js/bar.js" do app2? – danielgpm

+0

Tak. Jeśli app1 prosi o /css/foo.css, powinien być proxowany do app1.com/css/foo.css. Jeśli app2 żąda pliku /js/bar.js, powinien być proxited do app2.com/js/bar.js. – ragebiswas

Odpowiedz

7

Na podstawie zaktualizowanych komentarzy; jeżeli przed backend wysyła nagłówek odsyłający, można zrobić coś takiego:

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

Na przykład, jeśli backend na app2.com, żąda test.css takiego:

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

żądanie ziemia tutaj:

/app2/css/test.css 
+1

Nie sądzę, że masz moje pytanie jasno. Jeśli app1 prosi o '/ css/foo.css', powinien przekierować do' http: // app1.com/css/foo.css'. Jednakże, jeśli app2 żąda pliku '/ css/foo.css', powinien przejść do' http: // app2.com/css/foo.css' – ragebiswas

+0

, a następnie w jaki sposób 'app1' i' app2' są identyfikowane w żądaniu? Według użytkownika? nagłówek (odsyłający?) lub parametr żądania? Podaj więcej szczegółów ... – danielgpm

+1

Przepraszam, jeśli nie jestem jasny. App1 jest identyfikowany według lokalizacji. Dlatego użytkownicy powinni wpisać "example.com/app1/fooservice". ALE aplikacja końcowa dla aplikacji1 używa względnych adresów URL dla zasobów, takich jak '/ css/bar.css' i NOT'/app1/css/bar.css'. Czy problem jest teraz jasny? FWIW rozwiązanie z samego nginx może nie być tutaj możliwe. – ragebiswas