2013-01-24 62 views
16

मैं एक nginx कॉन्फ़िगरेशन सेटअप की तलाश में हूं जो Access-Control-Allow-Origin को Origin में प्राप्त मान पर सेट करता है।अनुरोध से मूल शीर्षलेख के आधार पर प्रतिक्रिया शीर्षलेख में nginx एक्सेस-कंट्रोल-अनुमति-उत्पत्ति को सही ढंग से कैसे सेट करें?

ऐसा लगता है कि * विधि क्रोम के साथ काम नहीं करती है और एकाधिक यूआरएल फ़ायरफ़ॉक्स के साथ काम नहीं करते हैं क्योंकि इसे सीओआरएस विनिर्देशन की अनुमति नहीं है।

अभी तक, एकमात्र समाधान Access-Control-Allow-Origin को मूल में प्राप्त मूल्य पर सेट करना है (हां कुछ सत्यापन लागू किया जा सकता है)।

प्रश्न यह है कि nginx में ऐसा कैसे करें, अधिमानतः अतिरिक्त एक्सटेंशन इंस्टॉल किए बिना।

set $allow_origin "https://example.com" 
# instead I want to get the value from Origin request header 
add_header 'Access-Control-Allow-Origin' $allow_origin; 
+0

क्रोम सबसे निश्चित रूप से 'पहुंच-नियंत्रण-अनुमति दें-उत्पत्ति साथ काम करना चाहिए: *'। क्या आप असफल अनुरोध/प्रतिक्रिया शीर्षलेख का उदाहरण प्रदान कर सकते हैं? यह भी मदद कर सकता है: https://gist.github.com/4165271 – monsur

+0

हाँ, डीफ़ के साथ क्रोम में काम करता है * और हम इसे थोड़ी देर के लिए उपयोग कर रहे थे - यहां मेरी कॉन्फ़िगरेशन का लिंक https://distinctplace.com/ 2017/04/17/nginx-access-control-allow-origin-cors/ – gansbrest

उत्तर

15

मैं अपने आप को इस का उपयोग करना शुरू कर रहा हूँ, और यह मेरे वर्तमान Nginx विन्यास में लाइन है:

add_header 'Access-Control-Allow-Origin' "$http_origin"; 

यह एक हैडर सेट केवल अनुमति मूल के रूप में अनुरोध की उत्पत्ति अनुमति देने के लिए । तो जहां से आप कभी भी आ रहे हैं केवल एक ही जगह है। तो यह "*" की अनुमति देने से बहुत अलग नहीं होना चाहिए, लेकिन यह ब्राउज़र के परिप्रेक्ष्य से अधिक विशिष्ट दिखता है।

इसके अतिरिक्त आप होस्ट करने के लिए होस्टनामों की श्वेतसूची निर्दिष्ट करने के लिए अपने Nginx कॉन्फ़िगरेशन में सशर्त तर्क का उपयोग कर सकते हैं। यहाँ से https://gist.github.com/Ry4an/6195025

if ($http_origin ~* (whitelist\.address\.one|whitelist\.address\.two)$) { 
    add_header Access-Control-Allow-Origin "$http_origin"; 
} 

एक उदाहरण मैं अपने खुद के सर्वर की अनुमति दी डोमेन को श्वेतसूची में इस तकनीक की कोशिश करने की योजना है।

+0

अभी यह एक पंक्ति और बूम जोड़ा गया है! किया और किया! धन्यवाद!!! – greenhouse

+0

यदि आपके पास एकाधिक होस्ट्स पर पृष्ठ हैं जिन्हें सीओआरएस संसाधन तक पहुंच की आवश्यकता है, तो यदि आप * का उपयोग नहीं कर रहे हैं तो आपको समस्याएं होगी। मूल निर्दिष्ट करके, आप उस संसाधन को अपने कैश में लॉक करने वाले पहले पृष्ठ पर लॉक करते हैं। बाद में अन्य पृष्ठों के अनुरोध उस कैश किए गए पृष्ठ को हिट करेंगे जो गलत उत्पत्ति की अनुमति देता है। वे लोड करने में असफल हो जाएंगे, भले ही आपकी श्वेतसूची उन्हें अनुमति दे। http://stackoverflow.com/questions/21104810/what-could-explain-the-browser-intermittently-not-loading-some-cors-crossorigin?noredirect=1&lq=1 – Mnebuerquo

+0

@Mnebuerquo कैशिंग समस्या को जोड़कर हल किया जा सकता है 'cache_key' पर $ http_origin। 'वेरी: उत्पत्ति' शीर्षलेख भेजना क्लाइंट साइड कैशिंग का ख्याल रखना चाहिए। (आईई/एज में वेरी हेडर के साथ समस्याएं हैं) – SleepProgger

27

if का उपयोग करके कभी-कभी try_files जैसे अन्य कॉन्फ़िगरेशन को तोड़ सकता है। आप अप्रत्याशित 404 के साथ समाप्त कर सकते हैं।

Use map instead

map $http_origin $cors_header { 
    default ""; 
    "~^https?://[^/]+\.example\.com(:[0-9]+)?$" "$http_origin"; 
} 

server { 
    ... 
    location/{ 
     add_header Access-Control-Allow-Origin $cors_header; 
     try_files $uri $uri/ /index.php; 
    } 
    ... 
} 

If is evil

+0

ओह, भगवान, धन्यवाद! –