एक रिवर्स प्रॉक्सी के साथ रिश्तेदार यूआरएल को सही तरीके से कैसे संभालना है


51

अपाचे में निम्नानुसार मेरे पास एक रिवर्स प्रॉक्सी सेटअप है:

सर्वर A पता के साथ www.example.com/folder रिवर्स प्रॉक्सी सर्वर है।

यह करने के लिए मैप्स: पता परीक्षण के साथ सर्वर बी ..mupupurl.com

इस तरह के काम करता है। लेकिन मेरे पास जो समस्या है, वह www.example.com/folder पर है, सभी संबंधित लिंक www.example.com/css/examplefilename.css के बजाय www.example.com/folder/css/examplefilameame के हैं। सीएसएस

मैं यह कैसे तय करुं?

अब तक मेरे रिवर्स प्रॉक्सी में सर्वर A (www.example.com) है:

<Location /folder>
    ProxyPass  http://test.madeupurl.com
    ProxyPassReverse http://test.madeupurl.com
</Location>

नीचे दिए गए समाधानों में से कौन सा आपके लिए HBruijn के उत्तर में काम करता है, यदि आपको याद है?
किम्बर्ली डब्ल्यू

जवाबों:


81

Apache ProxyPassRewrite http://test.example.com से प्राप्त प्रतिक्रिया निकायों को फिर से नहीं लिखती है , केवल हेडर (जैसे 404 पृष्ठ और इस तरह पुनर्निर्देशित)।

कई विकल्प:

एक ) पूर्ण के बजाय रिश्तेदार पथ का उपयोग करने के लिए आंतरिक एप्लिकेशन को फिर से लिखना। के ../css/style.cssबजाय यानी/css/style.css

दो ) आंतरिक ऐप /folderको test.example.com की जड़ के बजाय एक ही उपनिर्देशिका में फिर से लोड करें।

तीन ) एक और दो अक्सर होने की संभावना नहीं होती है ... यदि आप भाग्यशाली हैं कि आंतरिक ऐप केवल दो या तीन उपनिर्देशिकाओं का उपयोग करता है और जो आपके मुख्य साइट पर अप्रयुक्त हैं , तो बस ProxyPass लाइनों का एक गुच्छा लिखें:

# Expose Internal App to the internet.
ProxyPass /externalpath/  http://test.example.com/
ProxyPassReverse /externalpath/  http://test.example.com/
# Internal app uses a bunch of absolute paths. 
ProxyPass /css/  http://test.example.com/css/
ProxyPassReverse /css/  http://test.example.com/css/
ProxyPass /icons/  http://test.example.com/icons/
ProxyPassReverse /icons/  http://test.example.com/icons/

चार ) आंतरिक ऐप के लिए एक अलग उपडोमेन बनाएं और बस प्रॉक्सी को सब कुछ उल्टा कर दें:

<VirtualHost *:80>
   ServerName app.example.com/
   # Expose Internal App to the internet.
   ProxyPass /  http://test.internal.example.com/
   ProxyPassReverse /  http://test.internal.example.com/
</VirtualHost>

पांच ) कभी-कभी डेवलपर्स पूरी तरह से अव्यवस्थित होते हैं और उनके आवेदन न केवल निरपेक्ष URL उत्पन्न करते हैं, बल्कि उनके URL में होस्टनाम भाग भी शामिल करते हैं और परिणामी HTML कोड इस तरह दिखता है <img src=http://test.example.com/icons/logo.png>:।

) आप एक विभाजन क्षितिज डीएनएस और परिदृश्य के कॉम्बो समाधान का उपयोग कर सकते हैं। आंतरिक और बाहरी दोनों उपयोगकर्ता test.example.com का उपयोग करते हैं, लेकिन आपका आंतरिक DNS सीधे test.example.com के सर्वर के आईपी पते पर इंगित करता है। बाहरी उपयोगकर्ताओं के लिए test.example.com का सार्वजनिक रिकॉर्ड आपके सार्वजनिक वेबसर्वर www.example.com के आईपी-पते की ओर इशारा करता है और आप तब समाधान 4 का उपयोग कर सकते हैं।

बी ) आप वास्तव में अपाचे प्राप्त कर सकते हैं न केवल test.example.com को प्रॉक्सी अनुरोध, बल्कि आपके उपयोगकर्ताओं को प्रेषित होने से पहले प्रतिक्रिया निकाय को भी फिर से लिखना होगा। (आम तौर पर एक प्रॉक्सी केवल HTTP हेडर / प्रतिक्रियाओं को फिर से लिखता है)। Apache 2.2 में mod_substitute। मैंने परीक्षण नहीं किया है अगर यह mod_proxy के साथ अच्छी तरह से ढेर हो जाता है, लेकिन शायद निम्नलिखित काम करता है:

<Location /folder/>
  ProxyPass http://test.example.com/
  ProxyPassReverse http://test.example.com/ 
  AddOutputFilterByType SUBSTITUTE text/html
  Substitute "s|test.example.com/|www.example.com/folder/|i" 
</Location>

4
पवित्र गाय अच्छा उत्तर। अभी तक इनमें से किसी की भी कोशिश नहीं की है, सिर्फ लिखने के लिए धन्यवाद कहना चाहता था! लाख मदद करता है। अब इनमें से कुछ विचारों का परीक्षण करने के लिए जा रहे हैं और शीघ्र ही वापस रिपोर्ट करेंगे :)
हार्ड वर्कर

क्विक क्वेश्चन प्लीज, पॉइंट 2 के लिए अगर मैं आपको सही तरह से समझ लूं तो आप मुझे सुझाव दे रहे हैं कि मैं adpp को test.madeupurl.com/folder पर फिर से लोड करूं? क्या इसके लिए मेरी अपाचे कॉन्फिग फाइल में कोई बदलाव करना होगा? यह सबसे तेज समाधान की तरह दिखता है
हार्ड कार्यकर्ता

इसके अतिरिक्त, आपको परेशान करने के लिए क्षमा करें, लेकिन बिंदु 1 के साथ जब मैं कोशिश करता हूं कि आप मेरे प्रश्न में वर्णित समस्या का सुझाव दें तो भी बनी रहती है। उदाहरण के लिए मैंने यहां उपयोग किया: <लिंक rel = "स्टाइलशीट" प्रकार = "टेक्स्ट / सीएसएस" href = "../ सीएसएस / custom.css" /> और ब्राउज़र में लिंक पते के लिए यह test.madeupurl.com आउटपुट कर रहा है। /css/bootstrap.css बजाय test.madeupurl.com/folder/css/bootstrap.css । क्या आपके पास इस पर कोई सुझाव होगा, यह सबसे ज्यादा मददगार होगा
हार्ड वर्कर

अक्सर जब आप एक डॉक्यूमेंट को रीडायरेक्ट करते हैं, जो अब डॉक्यूमेंटरूट में एक उपनिर्देशिका में स्थापित होता है, जैसे / फोल्डर में स्टाइलशीट, आइकन आदि को / फोल्डर / सीएसएस और / फोल्डर / आइकन्स आदि में तैनात किया जाएगा, तो HTML आउटपुट में लिंक इस तरह हो जाएंगे <img src=/folder/icons/button.png>। बारी ProxyPass /folder/ http://test.madeupurl.com/folder/निर्देश द्वारा पकड़ा जाएगा ।
HBruijn

Test.madeupurl.com/content/index.html पेज test.madeupurl.com/css/custom.css को शामिल करना चाहता है। उस स्थान पर आपको सापेक्ष URL का उपयोग करना चाहिए href="../css/custom.css"और नहीं href="/css/custom.css"। जब इंटरनेट उपयोगकर्ता पृष्ठ को पुनः प्राप्त करता है तो URL www.example.com/folder/content/index.html होगा। सीएसएस के लिए URL तब होगा: www.example.com/folder/content/../css/custom.cssजो वास्तव में www.example.com/folder/css/custom.cssआगे भेजा जाएगा test.madeupurl.com/css/custom.css
HBruijn

8

HBruijn के उत्तर के पूरक के रूप में , यदि आप समाधान के लिए चुनते हैं (3) "ProxyPass", तो आपको अपने HTML पृष्ठों में कुछ URL को फिर से लिखने के लिए mod_proxy_html का उपयोग भी करना पड़ सकता है ।

सीएफ कैसे कुछ उदाहरणों के लिए रिवर्स प्रॉक्सी के साथ रिश्तेदार यूआरएल को सही ढंग से संभालना है

एक लागू उदाहरण के रूप में, यहाँ बताया गया है कि आप कैसे अपाचे को ProxyHTMLURLMapनियम का उपयोग करके कॉन्फ़िगर कर सकते हैं, जो आपके Etherpad उदाहरण में पोर्ट 9001 पर स्थानीय रूप से चल रहे अपने-domain-name.com/pad पर सब कुछ अग्रेषित करने के लिए है:

<Location /pad> ProxyPass http://localhost:9001 retry=0 # retry=0 => avoid 503's when restarting etherpad-lite ProxyPassReverse http://localhost:9001 SetOutputFilter proxy-html ProxyHTMLURLMap http://localhost:9001 </Location> RewriteRule ^/pad$ /pad/ [R]


2
हालांकि यह जान लें कि mod_proxy_html केवल Apache 2.4 और ऊपर से शामिल है, जहाँ ऊपर का मूल प्रश्न Apache 2.2 के लिए है
HBruijn

आपका उत्तर त्रुटिहीन है। हालाँकि, मैं एक ऐसे मामले से मिला जहाँ सामग्री html नहीं है, बल्कि यह pdf है। ProxyHTMLURLMap का उपयोग मेरे लिए काम नहीं किया। कोई अन्य सुझाव?
मोहम्मद एन्नहदी एल इदरीसी

2
यदि आपकी सामग्री एक पीडीएफ है, तो आपको इसमें यूआरएल को फिर से लिखने की आवश्यकता नहीं है! जब तक आप अपने उपयोगकर्ताओं को अपनी वेबसाइट के अन्य पृष्ठों तक पहुंचने के लिए पीडीएफ में लिंक पर क्लिक करना चाहते हैं, लेकिन यह मुश्किल लगता है। URL पुनर्लेखन को अक्षम करने के लिए, बस अंतिम 2 निर्देशों को छोड़ दें: SetOutputFilter& ProxyHTMLURLMap
लुकास साइमन

आपको एन्कोडिंग त्रुटियों से बचने के लिए RequestHeader unset स्वीकार-एन्कोडिंग जोड़ने की आवश्यकता हो सकती है
zar3bski

5

आप एक रिवर्स प्रॉक्सी बनाने के लिए निम्नलिखित तरीके का उपयोग कर सकते हैं:
1. mod_proxy_html स्थापित करें

    yum install mod_proxy_html
  1. Mod_proxy_html मॉड्यूल लोड करें

    LoadModule proxy_html_module modules/mod_proxy_html.so
    
  2. और निम्नलिखित सेटिंग का उपयोग करें

    ProxyRequests off  
    ProxyPass /folder/  http://test.madeupurl.com  
    ProxyHTMLURLMap http://test.madeupurl.com  /folder  
    
    <Location /folder/>  
        ProxyPassReverse /  
        ProxyHTMLEnable On  
        ProxyHTMLURLMap  /  /folder/  
        RequestHeader    unset  Accept-Encoding  
    </Location>  
    

उममीद है कि इससे मदद मिलेगी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.