nginx

2014-12-02 17 views
5

के साथ प्रॉक्सीइंग रिश्तेदार यूआरएल मेरा प्रश्न Nginx Relative URL to Absolute Rewrite Rule? के समान है - लेकिन एक जोड़ा मोड़ के साथ।nginx

मैं एक प्रॉक्सी सर्वर है, जो एक साथ कई एप्लिकेशन, इस (सरलीकृत) config के लिए इसी तरह के लिए प्रॉक्सी के रूप में कार्य nginx है:

server { 
    listen 80; 
    server_name example.com; 

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

यह ठीक काम करता है, लेकिन अन्य प्रश्न के रूप में, इन आवेदनों (app1 और app2) /css/foo.css, या /js/bar.js जैसे सापेक्ष यूआरएल का उपयोग करें। इसके अलावा सभी अनुप्रयोगों को /app1/css/foo.css जैसे कुछ बदलने के लिए कहने की एक बड़ी समस्या है।

क्या nginx को समझदारी से यह पता लगाना संभव है कि कौन से एप्लिकेशन को अनुरोध को संभालना चाहिए? एफटीआर, उपयोगकर्ता इस तरह के अनुप्रयोगों तक पहुंच पाएंगे:

http://example.com/app1/fooaction या http://example.com/app2/baraction

यदि यह महत्वपूर्ण है, तो सभी एप्लिकेशन जावा/टॉमकैट आधारित ऐप्स हैं।

टीआईए!

+0

आप थोड़ा और अधिक स्पष्ट कर सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं? क्या आप ऐप 2 और "/js/bar.js" को ऐप 2 में "/css/foo.css" अनुरोध पास करना चाहते हैं? – danielgpm

+0

हां। यदि ऐप 1/css/foo.css के लिए अनुरोध करता है, तो इसे app1.com/css/foo.css पर प्रॉक्सी किया जाना चाहिए। यदि app2 /js/bar.js के लिए अनुरोध करता है, तो इसे app2.com/js/bar.js पर प्रॉक्सी किया जाना चाहिए। – ragebiswas

उत्तर

7

आपकी अपडेट की गई टिप्पणियों के आधार पर; नदी के ऊपर बैकएंड संदर्भित हैडर भेजता है, तो आप कुछ इस तरह कर सकता है:

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

मुझे नहीं लगता कि आपको मेरा प्रश्न स्पष्ट रूप से मिला है। यदि ऐप 1 '/ css/foo.css' के लिए अनुरोध करता है, तो उसे 'http: // app1.com/css/foo.css' पर रीडायरेक्ट करना चाहिए। हालांकि, यदि '/ css/foo.css' के लिए ऐप 2 अनुरोध हैं तो इसे http: // app2.com/css/foo.css' – ragebiswas

+0

पर जाना चाहिए, फिर अनुरोध में' app1' और 'app2' की पहचान कैसे की जाती है? उपयोगकर्ता एजेंट द्वारा? हेडर (रेफरर?) या एक अनुरोध पैरा? कृपया अधिक जानकारी प्रदान करें ... – danielgpm

+1

क्षमा करें अगर मैं स्पष्ट नहीं हूं। App1 स्थान द्वारा पहचाना जाता है। तो उपयोगकर्ता 'example.com/app1/fooservice' टाइप करेंगे। लेकिन ऐप 1 के लिए डाउनस्ट्रीम एप्लिकेशन संसाधनों के सापेक्ष यूआरएल का उपयोग करता है, जैसे '/ css/bar.css' और NOT'/app1/css/bar.css'। क्या समस्या अब स्पष्ट है? FWIW अकेले nginx से एक समाधान संभव नहीं हो सकता है। – ragebiswas