2013-10-22 3 views
5
header('Access-Control-Allow-Origin: http://splash.example.com'); 
header('Access-Control-Allow-Credentials: true'); 

हैलो फिर से स्टैक ओवरफ्लो!एकाधिक डोमेन के लिए एक्सेस-कंट्रोल-अनुमति-उत्पत्ति, एक आसान तरीके से

मेरी वेबसाइट पर, मेरे पास AJAX फ़ाइल ajax.php है, जहां मुझे इसे एक्सेस करने और आग अनुरोधों के लिए एकाधिक (उप) डोमेन की आवश्यकता है।

$.ajax({ 
    ... 

    crossDomain: true, 
    xhrFields: { 
     withCredentials: true 
    }, 

    ... 
}); 

लेकिन वहाँ एक आसान तरीका नहीं है:

समस्या यह है कि समाधान ऊपर पोस्ट के साथ splash.example.com और example.com के लिए काम करता है, और अनुरोध में है? 'अभी कारण यह ऊपर पोस्ट किए गए समाधान के साथ भी www.example.com के लिए काम नहीं कर रहा है।

मैं अपने htaccess में इस डाल की कोशिश की है:

<IfModule mod_headers.c> 
    Header add Access-Control-Allow-Origin "http://example.com" 
    Header add Access-Control-Allow-Origin "http://www.example.com" 
    Header add Access-Control-Allow-Origin "http://splash.example.com" 
    Header set Access-Control-Allow-Credentials true 
</IfModule> 

लेकिन यह किसी भी तरह काम नहीं किया।

क्या आप लोग मेरी मदद कर सकते हैं?

उत्तर

5

पसंदीदा विधि अनुरोध हेडर को पढ़ने, मूल खोजने के लिए, इसे अपने सर्वर साइड कोड में जांचना होगा। यदि डोमेन को पृष्ठ तक पहुंचने की अनुमति है, तो मूल डोमेन को एक एकल Access-Control-Allow-Origin शीर्षलेख में वापस भेजें।

एक अन्य समर्थक: कोई अन्य डोमेन उपयोगकर्ता स्वीकृत डोमेन की सूची नहीं देखेगा। प्रत्येक उपयोगकर्ता केवल अपना डोमेन देखेगा (अगर अनुमति है)।

+0

एक अनुरोध हेडर कैसे की जाँच करें और मूल मिलेगा? – Thew

+1

PHP में यह '$ _SERVER [" HTTP_ORIGIN "]' – devnull69

+0

में है, मैंने इसे 'apache_request_headers()' की जांच करके हल किया है, जो एक सरणी देता है, फिर उस सरणी की 'मूल' कुंजी जांचें, जांचें कि क्या यह एक है अनुमत (उप) डोमेन, और यदि यह है, तो इसे जोड़ना: 'हेडर (' एक्सेस-कंट्रोल-ऑब्जेक्ट-उत्पत्ति: '$ http_origin); ' ' हेडर ('एक्सेस-कंट्रोल-अनुमति-प्रमाण-पत्र: सत्य'); ' 'हेडर (' एक्सेस-कंट्रोल-स्वीकृति-हेडर: एक्स-अनुरोधित-साथ ');' – Thew

3

इस मुद्दे को कई हफ्ते पहले भी मिला और यह शानदार समाधान मिला।

यह किसी भी उप डोमेन को गतिशील रूप से HTTP_Origin शीर्षलेख को देखकर, मूल होस्ट के उप-डोमेन को निकालने, और एक्सेस-कंट्रोल-अनुमति-उत्पत्ति शीर्षलेख में इसका उपयोग करके अनुमति देता है।

बस अपनी .htaccess फाइल करने के लिए निम्नलिखित जोड़ें:

<IfModule mod_headers.c> 
<IfModule mod_rewrite.c> 
    # Dynamically change the Access-Control-Allow-Origin header to match the sub-domain the request is coming from 
    # Define the root domain that is allowed 
    SetEnvIf Origin .+ ACCESS_CONTROL_ROOT=example.com 
    # Check that the Origin: matches the defined root domain and capture it in an environment var if it does 
    RewriteEngine On 
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT} !="" 
    RewriteCond %{ENV:ACCESS_CONTROL_ORIGIN} ="" 
    RewriteCond %{ENV:ACCESS_CONTROL_ROOT}&%{HTTP:Origin} ^([^&]+)&(https?://(?:.+?\.)?\1(?::\d{1,5})?)$ 
    RewriteRule .* - [E=ACCESS_CONTROL_ORIGIN:%2] 
    # Set the response header to the captured value if there was a match 
    Header set Access-Control-Allow-Origin %{ACCESS_CONTROL_ORIGIN}e env=ACCESS_CONTROL_ORIGIN 

    # Allow credentials to enable cookies being sent cross domain, so the user can stay logged is as long as the session file is available to both domains 
    Header set Access-Control-Allow-Credentials "true" 

    # Set here the headers needed for the AJAX requests, if a needed header is not in this list you will see an error in Chrome mentioning which header needs to be added here 
    Header set Access-Control-Allow-Headers "sender, filename, content-type, accept, x-requested-with, x-request" 
</IfModule> 
</IfModule> 
+3

एचटीएसीएएस पागलपन के लिए +1। – Thew

+0

मैं एकाधिक डोमेन के लिए इसका उपयोग कैसे कर सकता हूं? –

संबंधित मुद्दे