2014-12-02 33 views
5

我的問題類似於Nginx Relative URL to Absolute Rewrite Rule? - 但有一個額外的轉折。用nginx代理相關網址

我作爲代理服務器,代理了多個應用,類似於這樣(簡化)配置nginx的:

server { 
    listen 80; 
    server_name example.com; 

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

這工作得很好,但在其他問題,這些應用程序(app1app2)使用相關網址,例如/css/foo.css/js/bar.js。此外,要求所有應用程序更改爲類似/app1/css/foo.css的東西也是一個大問題。

nginx是否可以智能地找出哪個應用程序應該處理請求? FTR,用戶可以像這樣訪問這些應用程序:

http://example.com/app1/fooactionhttp://example.com/app2/baraction

如果很重要,所有應用程序都是基於Java/Tomcat的應用程序。

TIA!

+0

你能否澄清一點點,你要實現的目標是什麼?你想要傳遞請求「/css/foo.css」到app1和「/js/bar.js」到app2嗎? – danielgpm 2014-12-04 00:17:26

+0

是的。如果app1請求/css/foo.css,則應將其代理到app1.com/css/foo.css。如果app2請求/js/bar.js,則應將其代理到app2.com/js/bar.js。 – ragebiswas 2014-12-04 06:18:58

回答

7

根據您的更新評論; 如果上游後臺發送Referer標頭,你可以做這樣的事情:

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

例如,如果在app2.com後端,要求這樣的test.css:

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

請求這裏的土地:

/app2/css/test.css 
+1

我不認爲你清楚地得到了我的問題。如果app1請求'/ css/foo.css',則它應該重定向到'http:// app1.com/css/foo.css'。但是,如果app2請求'/ css/foo.css',它應該轉到'http:// app2.com/css/foo.css' – ragebiswas 2014-12-10 10:52:09

+0

,那麼app1和app2在請求中是如何標識的?通過用戶代理?頭(引薦?)或請求參數?請提供更多詳細信息... – danielgpm 2014-12-10 14:37:58

+1

對不起,如果我不清楚。 App1由位置標識。所以用戶可以鍵入'example.com/app1/fooservice'。但app1的下游應用程序使用資源的相對URL,例如'/ css/bar.css'和NOT'/ app1/css/bar.css'。問題現在清楚了嗎? FWIW一個來自nginx的解決方案在這裏可能是不可能的。 – ragebiswas 2014-12-12 07:10:59