2013-01-06 35 views
10

एक वेब अनुप्रयोग विकसित करने की आवश्यकता है जो एक ही समय में एपीआई पर अत्यधिक निर्भर है लेकिन साथ ही एपीआई के समान डोमेन पर भी नहीं रह सकता है, एसिंक्रोनस बनाते समय "समान उत्पत्ति नीति" के आसपास होना मुश्किल हो गया है HTTP अनुरोध (AJAX)। एक बिंदु पर, मुझे अपने कंप्यूटर पर WAMP इंस्टॉल करने की आवश्यकता थी (विंडोज 7 चलाना) और अपाचे के साथ एक रिवर्स प्रॉक्सी कॉन्फ़िगर करने के लिए। एक ही व्यक्ति ने मुझे दिया अपाचे निर्देशों bellow कि मैं c:\windows\system32\drivers\etc\hosts पर httpd.conf फ़ाइल को जोड़ा गया, देव नामित आईपी 127.0.0.1 के लिए एक अन्य नाम बनाना मुझे बता के बाद, फ़ाइल के भीतर (जो मैंने किया था):क्रॉस-डोमेन AJAX के लिए उपयोग किए जाने के लिए अपाचे के साथ एक रिवर्स प्रॉक्सी को सही तरीके से कॉन्फ़िगर कैसे करें?

LoadModule headers_module modules/mod_headers.so 
LoadModule proxy_module modules/mod_proxy.so 
LoadModule proxy_connect_module modules/mod_proxy_connect.so 
LoadModule proxy_http_module modules/mod_proxy_http.so 
LoadModule ssl_module modules/mod_ssl.so 

Listen 127.0.0.1:8080 
ProxyRequests off 

<Proxy *> 
       Order deny,allow 
       Deny from all 
       Allow from 127.0.0.1 
</Proxy> 

<VirtualHost dev:8080> 
       ProxyPass/https://app.somesite.com:5002/ 
       ProxyPassReverse/https://app.somesitecom:5002/ 
       ProxyPassReverseCookieDomain app.somesite.com dev 
       Header edit Location ^https://dev(:8080)?(.+)$ http://dev$1$2 
       Header edit Set-Cookie "(^.+); secure; HttpOnly$" "$1; HttpOnly" 
       SSLProxyEngine on 
    SSLProxyVerify none 
</VirtualHost> 

चूंकि सर्वरों को कॉन्फ़िगर करने की बात आने पर मैं एक पूर्ण नौसिखिया हूं, इसलिए मैंने निर्देशों को सौंपा और सौभाग्य से पर्याप्त रूप से पर्याप्त किया, प्रॉक्सी ने काम किया। जब मैं ब्राउजर के एड्रेस बार का उपयोग करने के लिए उपयोग करता हूं, तो यह एपीआई से सही प्रतिक्रिया देता है, उदाहरण के लिए, http://dev:8080/a/w/currencies

दुर्भाग्य से, एक ही यूआरएल (कोड bellow) के लिए एक AJAX अनुरोध क्रोम मुझे XMLHttpRequest cannot load http://dev:8080/a/w/currencies. Origin http://dev is not allowed by Access-Control-Allow-Origin. त्रुटि देता है।

$.ajax({ 
    url: "http://dev:8080/a/w/currencies", 
    type: "GET", 
    dataType: "json", 
    data: { 

    }, 
    success: function(data){ 
     console.log(data); 
    } 
}); 

तो इस प्रॉक्सी के लिए AJAX के साथ काम करने के लिए अभी भी क्या किया जाना चाहिए? मुझे alias निर्देश के बारे में कुछ बताया गया है, लेकिन विशिष्ट और स्पष्ट नहीं है, इसलिए यह मेरे अनुभवहीन मस्तिष्क को ज्यादा समझ में नहीं आया।

पीएस: इसके अलावा, मुझे बताया गया है कि "समस्या यह है कि आपको देव: 80 से फाइलें मिल रही हैं और dev से AJAXing: 8080"। मेरे अनुभवहीनता को देखते हुए, न ही यह बहुत समझ में आता है।

+0

आप यूआरएल के साथ ajax लिख सकते है : 5002/' app.somesite.com पर apache की कॉन्फ़िगरेशन क्या है? क्या यह 5002 बंदरगाह सुन रहा है? –

+0

AJAX के पास रिवर्स प्रॉक्सी करने या हस्तक्षेप करने के लिए कुछ भी नहीं है, यह केवल आपकी प्रॉक्सी कॉन्फ़िगरेशन है जो आपके लिए सही तरीके से काम करनी चाहिए। –

+0

यदि आपका गलती –

उत्तर

10

आपके पास एक सार्वजनिक आईपी के साथ एक सर्वर है और अपाचे चल रहा है.अब आप अपने अनुप्रयोगों को लैन पर होस्ट करना चाहते हैं और यह भी चाहते हैं कि वे इंटरनेट पर पहुंच सकें, महत्वपूर्ण हिस्सा यह है कि ये एप्लिकेशन अभी भी मशीनों पर चल रहे हैं लैन पर

      |--------------192.168.1.3 
          |   (internal3.example.com) 
          | 
          |--------------192.168.1.4 
          |   (internal4.example.com) 
    (Public IP)    | 
      A--------------| 
(reverse proxy server)  | 
    (192.168.1.25)   | 
example.com    | 
          |--------------192.168.1.1 
          |   (internal1.example.com) 
          | 
          |--------------192.168.1.2 
          |   (internal2.example.com) 

मैं Ubuntu का उपयोग कर रहा डेबियन आधारित प्रणालियों के मामले में अपाचे vhost परिभाषा की मेजबानी के लिए वेबसाइटों की definiton

/etc/apache2/sites-enabled/*.conf

पर किया जाता है जहां * conf को internal4.conf

internal3.conf internal2.conf

internal1.conf इन साइटों में से प्रत्येक के vhost परिभाषा के रूप में किया जाएगा मेल खाती है इस प्रकार

/etc/apache2/sites-enabled/internal1.example.conf

ServerAdmin [email protected] 
    ServerName internal1.example.com 
    ProxyRequests off 
    <proxy *> 
    Order deny,allow 
    Allow from all 
    </proxy > 
    ProxyPass/http://192.168.1.1/ 
    ProxyPassReverse/http://192.168.1.1/ </VirtualHost > 

/etc/apache2/sites-enabled/internal2.example.conf

<virtualhost *:80> 

     ServerAdmin [email protected] 
     ServerName internal2.example.com 
     ProxyRequests off 
     <proxy *> 
     Order deny,allow 
     Allow from all 
     </proxy > 
     ProxyPass/http://192.168.1.2/ 
     ProxyPassReverse/http://192.168.1.2/ 
</VirtualHost > 

/etc/apache2/sites-enabled/internal3.example।conf

<virtualhost *:80> 

     ServerAdmin [email protected] 
     ServerName internal3.example.com 
     ProxyRequests off 
     <proxy *> 
     Order deny,allow 
     Allow from all 
     </proxy > 
     ProxyPass/http://192.168.1.3/ 
     ProxyPassReverse/http://192.168.1.3/ 
</VirtualHost > 

/etc/apache2/sites-enabled/internal4.example.conf

 ServerAdmin [email protected] 
     ServerName internal4.example.com 
     ProxyRequests off 
     <proxy *> 
     Order deny,allow 
     Allow from all 
     </proxy > 
     ProxyPass/http://192.168.1.4/ 
     ProxyPassReverse/http://192.168.1.4/ 
</VirtualHost > 

नोट ऊपर vhost परिभाषाओं के सभी में मैं लॉग फ़ाइलों के विकल्प गिरावट आई है। तो यदि आप किसी उत्पादन सर्वर पर लागू होते हैं तो उन्हें प्रत्येक vhost फ़ाइल में जोड़ें। ऊपर आपको एक स्पष्ट कट उदाहरण देने के लिए है कि यह कैसे काम कर सकता है। मैं एक बहुत ही जटिल अपाचे सेटअप चलाता हूं, इसलिए आपकी मदद करने के लिए बस एक छोटा सा उदाहरण है।

अब क्रोम Ctrl + Shift में अपने प्रश्न

की अजाक्स भाग के लिए आ रहा + मैं तुम्हें जहां वास्तव में आवेदन टूट गया है देखेंगे, यह आप कुछ सुराग दे देंगे, (इस मुद्दे को एक मशीन से अनुरोध मशीन से अलग) भी यदि आप http://sample पृष्ठ से अनुरोध करते हैं तो एजेक्स एपीआई वास्तव में आपके अपाचे सर्वर पर पहुंचने के लिए अपाचे लॉग देख सकता है जो आपको अधिक संकेत देगा, अगर प्रॉक्सी आपके अग्रेषण को अग्रेषित कर रहा है सही तरीके से अनुरोध करें, HTTP हेडर्स को फ़ायरफ़ॉक्स में कुछ टूल का उपयोग करके लाइव_http की स्थिति में पोस्ट करें जब कोई अनुरोध नहीं था और अनुरोध कब किया गया था इस तरह से हेडर को देखकर एप्लिकेशन आपकी मदद कर सकता है यदि अनुरोध रिवर्स प्रॉक्सी के पीछे सर्वर तक पहुंच गया है, तो वेब के अनुरोध पर पहुंचने पर या नहीं, और अनुरोध पर पहुंचने पर सर्वर के लॉग की जांच करें जो रिवर्स प्रॉक्सी चला रही है अनुरोध किया गया यूआरएल। यह आपको एक सुराग देगा,

और आपकी .conf फाइलों में विकास के उद्देश्य के लिए कुछ समय के लिए पुनः लिखने के नियमों को अक्षम करने के लिए अक्षम करें, इसे एक-एक करके करें।

+1

मैं आपकी मदद करने के लिए समय लेने की सराहना करता हूं, लेकिन पूरी तरह से ईमानदार होने के लिए, मुझे समझ में नहीं आता है। –

+0

मैंने अपने प्रश्न के नीचे निम्नलिखित टिप्पणी लिखी: "शायद मैं पर्याप्त स्पष्ट नहीं हो सकता था, इसके बारे में खेद है। दोहराने के लिए, यदि मैं बस ब्राउजर एड्रेस बार से 8080/ए/डब्ल्यू/मुद्राओं तक पहुंचता हूं, तो यह ठीक से कुछ वापस कर देगा JS.s प्रारूप में डेटा, app.somesite.com phot002/a/w/currencies से। हालांकि, ऊपर AJAX कॉल को आजमाते समय, मुझे दिया जा रहा है ... ... dev लोड नहीं कर सकता: 8080/a/w/मुद्राएं। उत्पत्ति देव को एक्सेस-कंट्रोल-अनुमति-उत्पत्ति 'त्रुटि द्वारा अनुमति नहीं है। इसलिए मैं स्टंप हो गया हूं। " –

+0

हमम मैंने आपकी टिप्पणी वास्तव में देखी है, इसलिए मैं एक वेब लड़का नहीं हूं इसलिए मुझे AJAX समझ में नहीं आ रहा है, इसलिए मैं अपने प्रश्न का पूरी तरह से जवाब नहीं दे सका, बस इस धागे को उस व्यक्ति को दिखाएं जिसने आपको vhost कॉन्फ़िगरेशन दिया है और उससे पूछें कि क्या आप https को अक्षम करते हैं कुछ समय या पुनर्निर्देशन के लिए भाग, मान लें कि आपका आवेदन मशीन ए पर विकसित है, इसलिए मशीन सी पर जाएं और 'http: // yourapp' करें <- यह बी (जो रिवर्स प्रॉक्सी है) का अनुरोध जारी करेगा और देखें कि क्या अनुरोध बी तक पहुंचे और ए के लॉग जांचें यदि अनुरोध ए और बी समान हैं तो आपका काम आसान हो जाता है। –

-1

मैं वही चीज़ जल्द ही कोशिश कर रहा हूं जो मुझे यह धागा मिला।

मुझे आश्चर्य है कि अगर आप AJAX अनुरोध में उपयोग कर रहे वास्तविक यूआरएल गलत हैं। अनिवार्य रूप से, आप प्रॉक्सी से जुड़ रहे हैं। यह आपको पोर्ट 8080 पते पर अग्रेषित कर रहा है। फिर आप 8080 पते पर सीधे AJAX अनुरोध करने का प्रयास करते हैं? एक सापेक्ष लिंक काम कर सकता है ताकि AJAX कॉल उसी पथ के साथ अग्रेषित हो जाए ताकि जावास्क्रिप्ट को यह वही उत्पत्ति हो।

एक विकल्प PHP के साथ समर्थन कर रहा है। इस ऑनलाइन पाठ्यक्रम के व्याख्यान 7 में AJAX शामिल है और PHP के साथ एक उदाहरण है जो पूरी तरह से मूल प्रतिबंधों को बाधित करता है। http://academicearth.org/courses/building-dynamic-websites/

मुझे यह अभी मिला, यह एक बेहतर समाधान की तरह लगता है। http://darius.kruythoff.net/blog/2011/xss-with-apache/

+0

का उत्तर क्या दिया गया था, इनमें से कोई भी लिंक अब काम नहीं करता है। – chown

1

समस्या यह है कि ब्राउज़र आपको कुछ वेब पेज पर यादृच्छिक जावास्क्रिप्ट द्वारा पनडने से बचाने की कोशिश कर रहा है। यदि यह सभी जावास्क्रिप्ट को उसी संदर्भ में चलाने देता है तो आप फेसबुक सत्र कुकीज़ या बुरे लोगों को कुछ अन्य डेटा खो देंगे।

इस मामले में अपराधी कुछ इतना आसान हो सकता है क्योंकि क्रोम 'देव' को पूरी तरह से योग्य डोमेन नाम नहीं मानता है, इसलिए यह वही मूल परीक्षण विफल हो जाएगा। अन्य कारण यह हो सकता है कि किसी बिंदु पर आपको app.somesite से सामान मिल रहा है।देव और कुछ बिंदु आप 'देव' के लिए अनुरोध भेजने पर

सर्वर परवाह नहीं है कि वे क्या भेजने के लिए और यह ब्राउज़र तुम सब कुछ एक ही मेजबान

  1. मैं से आ रही है पर विश्वास करने को बेवकूफ बनाने की जरूरत है मेजबान में 'देव' की जगह लेंगे dev.example.com 127.0.0.1
  2. साथ फाइल मैं होगा यकीन है कि सब कुछ अपाचे प्रॉक्सी से बाहर आ ही जो सर्वर से
  3. आता है कोई फर्क नहीं पड़ता dev.example.com को संदर्भित करता है केवल अपने कोड
में dev.example.com का उपयोग करें

यदि अन्य सभी विफल हो जाते हैं तो आप किसी भी उत्पत्ति को अनुमति देने के लिए HTTP शीर्षलेख 'एक्सेस-कंट्रोल-अनुमति-उत्पत्ति: *' जोड़ सकते हैं, लेकिन मैं केवल देव वातावरण में छोड़कर इसका उपयोग नहीं करता।

पीएस। यहां तक ​​कि अगर आपको example.com:80 से जावास्क्रिप्ट मिलता है, तो जावास्क्रिप्ट example.com:443 या जावास्क्रिप्ट को भी नहीं कह सकता है example.com से xmlhttprequests dev.example.com

0

127.0.0.1 पर, आपका एचटीएमएल कोड होना चाहिए:

$.ajax({ 
    url: "http://127.0.0.1/a/w/currencies", 
    type: "GET", 
    dataType: "json", 
    data: { 
    }, 
    success: function(data){ 
     console.log(data); 
    } 
}); 

127.0.0.1 पर, अपने अपाचे conf होना चाहिए:

... 

<VirtualHost dev:8080> 
      ... 
      ProxyPass/https://app.somesite.com:5002/ 
      ProxyPassReverse/https://app.somesitecom:5002/ 
      ... 
</VirtualHost> 

इस मामले पर, आपके ब्राउज़र नहीं होगा क्रॉस-डोमेन, क्योंकि आपके यूआरएल और ajax ही डोमेन का उपयोग। लेकिन वास्तव में, AJAX अनुरोध https://app.somesite.com:5002/, मुझे नहीं पता कि यह एक रिवर्स-प्रॉक्सी है, लेकिन यह मेरे लिए काम लगता है। http: // देव: 8080/w/मुद्राओं आपके प्रॉक्सी पास निम्नलिखित है मैं देख रहा हूँ/एक `ProxyPass/https://app.somesite.com एक कोशिश :)