2012-09-19 33 views
31

सार:कैश्ड गैर CORS प्रतिक्रिया संघर्ष का अनुरोध

मैं एक पेज S3 (एचटीएमएल img टैग) से एक छवि का टैग लोड हो रहा है का उपयोग करता है और मैं एक पेज xmlhttprequest का उपयोग करता है। टैग लोडिंग को सीओआरएस हेडर के बिना कैश किया जाता है और इसलिए xmlhttprequest कैश किए गए संस्करण को देखता है, यह हेडर की जांच करता है और क्रॉस मूल त्रुटि के साथ विफल रहता है।

विवरण:

संपादित: दोनों सफारी 5.1.6 और क्रोम 21.0.1180.89 में विफल। फ़ायरफ़ॉक्स 14 में

S3 के नए CORS का उपयोग करना, मैं सेटअप एक CORSRule के रूप में तो ठीक काम करता है:

<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>HEAD</AllowedMethod> 
    <MaxAgeSeconds>0</MaxAgeSeconds> 
    <AllowedHeader>*</AllowedHeader> 
</CORSRule> 

मैं अनुरोध शीर्षों में मूल की स्थापना के बिना S3 से एक छवि का अनुरोध करते हैं मैं वापस छवि के बिना प्राप्त प्रतिक्रिया में किसी भी कोर हेडर।

यह कैश किया गया है और बाद में सीओआरएस अनुरोध (एक है जो अनुरोध शीर्षलेख में मूल सेट करता है) अस्वीकार कर दिया जाता है क्योंकि ब्राउजर गैर कैरस संस्करण कैश के रूप में उपयोग करता है।

इसे हल करने का सबसे अच्छा तरीका क्या है? क्या मैं कुछ सेट कर सकता हूं ताकि गैर कोर संस्करण कभी कैश न हो जाए? क्या मुझे अनुरोध के यूआरएल में ?some_flag जोड़कर सीओआरएस अनुरोधों को अलग करना चाहिए?

आदर्श रूप से मेरे पास S3 हमेशा आवश्यक कोरस हेडर भेज देगा, भले ही अनुरोध में "मूल" न हो।

+0

आप किस ब्राउज़र का उपयोग कर रहे हैं? क्या यह व्यवहार सभी ब्राउज़रों में होता है? यह एक ब्राउज़र बग की तरह लगता है। आपके द्वारा प्रस्तावित क्वेरी पैरामीटर समाधान एक अच्छा कामकाज की तरह लगता है। – monsur

+0

जोड़ा गया "संपादित करें: सफारी 5.1.6 और क्रोम 21.0.1180.89 दोनों में विफलता। फ़ायरफ़ॉक्स में ठीक काम करता है 14." – Wes

+1

शायद एक वेबकिट बग तो। यह एक ही मुद्दे की तरह लगता है: https://bugs.webkit.org/show_bug.cgi?id=63090 बग सुझाव देता है कि शीर्षलेख "वेरी: उत्पत्ति" जोड़ना समस्या को हल कर सकता है। – monsur

उत्तर

7

मैं एक ही समस्या में भाग गया। जैसा कि @ मॉन्सूर ने कहा, समस्या यह है कि एस 3 टीएच "वेरी: ओरिजिन" हेडर सेट नहीं करता है, भले ही इसे करना चाहिए। दुर्भाग्य से, जहां तक ​​मुझे पता है कि उस शीर्षलेख को भेजने के लिए S3 प्राप्त करने का कोई तरीका नहीं है। हालांकि, आप CORS की आवश्यकता होने पर ?origin=example.com जैसे अनुरोध पर क्वेरी स्ट्रिंग पैरामीटर जोड़कर इसके आसपास काम कर सकते हैं। क्वेरी स्ट्रिंग ब्राउज़र को कैश किए गए संसाधन का उपयोग न करने के लिए मजबूर करती है।

आदर्श रूप से, क्लाउडफ़्रंट और एस 3 वेरी भेज देंगे: मूल शीर्षलेख जब कोरस सक्षम होता है और/या वेबकिट मूल हेडर पर भिन्न रूप से भिन्न होता है, जिसे मैं फ़ायरफ़ॉक्स मानता हूं क्योंकि इसमें यह समस्या नहीं है।

6

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

var img = document.createElement('img'); 
img.setAttribute('src', yourRequestUrl + '?d=' + Date.now()); 
tagToAppendImg.appendChild(img); 

इस हमेशा की तरह, एक uncached प्रतिक्रिया के लिए बाध्य करेगा क्योंकि मिलीसेकेंड में तारीख हमेशा एक अलग URL कि ब्राउज़र अभी तक पता नहीं है पैदा करता है, लेकिन मैं अगर अनिश्चित हूँ यह आपकी समस्या हल करता है।

0

आप अपने सीओआरएस अनुरोध के बाद जावास्क्रिप्ट का उपयोग कर आईएमजी टैग जोड़ सकते हैं।

0

एक समाधान हमेशा एक CORS अनुरोध करने के लिए मजबूर करने के लिए ब्राउज़र img -tag पर crossorigin='use-credentials' विशेषता निर्धारित करने में हो सकता है, यहाँ देखें: https://stackoverflow.com/a/34496683/725542

एक अन्य समाधान स्वचालित रूप से गैर-चालू करने के लिए अपने CloudFront वितरण को विन्यस्त किया जाएगा सीओआरएस अनुरोधों में सीओआरएस अनुरोध करता है।प्रत्येक अनुरोध के लिए एक सीओआरएस हेडर जोड़कर यह संभव है क्लाउडफ्रंट हाल ही में जोड़ा गया क्लाउडफ्रंट सुविधा "नियंत्रण एज-टू-ओरिजिनल अनुरोध शीर्षलेख" का उपयोग करके S3 पर भेजता है। https://aws.amazon.com/blogs/aws/cloudfront-update-https-tls-v1-1v1-2-to-the-origin-addmodify-headers/

और यहाँ प्रलेखन: http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/forward-custom-headers.html

यहाँ सुविधा घोषणा देखें।

0

मैं भी इस समस्या में भाग गया। मैंने अपने एस 3 बाल्टी के सामने क्लाउडफ़्रंट वितरण स्थापित करना समाप्त कर दिया, और विकल्प को Origin Settings क्लाउडफ़्रंट में सेक्शन को Origin: https://example.com को मेरे S3 मूल में भेजने के लिए सेट किया। इससे S3 हमेशा सीओआरएस हेडर की सेवा करता है, क्योंकि यह हमेशा Origin अनुरोध शीर्षलेख देखता है। ऐसा करने के लिए, आपको यह सुनिश्चित करना होगा कि Origin शीर्षलेख आपके किसी भी क्लाउडफ़्रंट व्यवहार से श्वेतसूचीबद्ध नहीं है।

tl; dr: मैंने क्लाउडफ़्रंट को Origin: https://example.com को मेरे S3 मूल के प्रत्येक अनुरोध के साथ भेजने के लिए कहा, और क्लाउडफ़्रंट के माध्यम से मेरी सामग्री की सेवा की।

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

  • कोई संबंधित समस्या नहीं^_^