2011-08-05 12 views
17

मैं एक ही डोमेन पर एक पृष्ठ पर एक पोस्ट AJAX अनुरोध करने के लिए jQuery 1.6.2 का उपयोग कर रहा हूं। वह पृष्ठ किसी अन्य पृष्ठ पर 302 रीडायरेक्ट करता है।एक AJAX कॉल में, 302 का पालन नहीं किया गया है

अब, मेरी स्थानीय मशीन पर यह ठीक काम करता है लेकिन हमारे उत्पादन सर्वर पर, रीडायरेक्ट का पालन नहीं किया जाता है और क्रोम इंस्पेक्टर में अनुरोध को 'रद्द' कहा जाता है।

अगर मैं जावास्क्रिप्ट को शामिल किए बिना एक ही पृष्ठ पर जाएँ, सब कुछ ठीक काम करता है, और जैसा कि मैंने कहा AJAX के अपने स्थानीय मशीन पर काम करता है लेकिन उत्पादन सर्वर पर नहीं।

क्या किसी को पता है कि इसका कारण क्या हो सकता है?

सर्वर (ओएस एक्स, अपाचे 2, PHP5.3.6, स्थानीय मशीन, यूबंटू, लाइटटीपीडी, पीएचपी 5.3.3, एचटीटीपीएस पर एचटीटीपी) के बीच कुछ अंतर हैं) लेकिन मेरे लिए कोई भी अंतर नहीं करना चाहिए।

+1

मुझे लगता है कि 302 रीडायरेक्ट एक ही डोमेन पर किसी अन्य संसाधन पर है? वास्तव में –

+0

। कोहाना में एक बग था, हालांकि एचटीटीपीएस के बजाय रीडायरेक्ट HTTP होने का कारण बन गया। इससे ब्राउजर ने अनुरोध रद्द कर दिया होगा। – Johan

+3

उत्कृष्ट। इसे नीचे दिए गए उत्तर के रूप में जोड़ें - दो दिनों में, आप अपने उत्तर को सही के रूप में स्वीकार करने में सक्षम होंगे ताकि भविष्य में ऐसी समस्याएं हो सकें जो इसे प्राप्त कर सकें। –

उत्तर

11

बाहर कर देता है रीडायरेक्ट कोड में एक बग के कारण होता है http पर जाने के लिए पुन: निर्देश: // जबकि पेज कि अनुरोध किया गया था https था: //। इससे ब्राउजर रीडायरेक्ट का पालन करने से इंकार कर देता है।

+1

तो इस तरह आप अपनी क्वेरी को कैसे हल करते हैं, वैसे ही मुझे भी सामना करना पड़ रहा है। –

6
function doAjaxCall() { 
    $.ajaxSetup({complete: onRequestCompleted}); 
    $.get(yourUrl,yourData,yourCallback); 
} 

function onRequestCompleted(xhr,textStatus) { 
    if (xhr.status == 302) { 
     location.href = xhr.getResponseHeader("Location"); 
    } 
} 

आपके उत्तर से संबंधित प्रश्नों के बाद निम्नलिखित प्रश्न। आप नीचे दिए गए लिंक से जवाब पा सकते हैं।

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

+4

ब्राउजर को जेएस को 302 पास नहीं करना चाहिए, क्योंकि ब्राउजर रीडायरेक्ट को पारदर्शी रूप से संभालता है, इसलिए jQuery कभी नहीं जानता कि इसे रीडायरेक्ट किया गया था। मैं इस बात पर स्पष्ट नहीं हूं कि यह सभी ब्राउज़र है, हालांकि क्रोम स्पष्ट रूप से इस तरह से करता है और अन्य ने ओपेरा/एफएफ की इसी तरह रिपोर्ट की है। – DanH

+0

'ब्राउज़र को जेएस को 302 पास नहीं करना चाहिए' इसका मतलब यह नहीं है कि आपको जवाब को वोट देना होगा। उपर्युक्त कोड को अपने आप आज़माएं और फिर सही जवाब दें यदि यह गलत है तो बिना मतदान किए मतदान। और 3 अपवॉट्स के साथ-साथ –

+6

'xhr.status == 302' कभी नहीं होना चाहिए क्योंकि ब्राउज़र द्वारा 302 को संभाला जाएगा, जो तब केवल 200 या अन्य त्रुटि कोड जेएस को वापस कर देगा, इसलिए मैं इस प्रतिकूल सलाह पर विचार करता हूं । मैं -1 को हटा दूंगा हालांकि आप अन्य प्रश्नों से लिंक करते हैं। मैं एक अलग जवाब प्रदान करूंगा। – DanH

2

इस उत्तर के आधार पर:

{redirect: '/redirect/to/this/path'} 

और ajaxComplete सुनिश्चित करेंगे:

$('body').ajaxComplete(function (e, xhr, settings) { 
    if (xhr.status == 200) { 
     var redirect = null; 
     try { 
      redirect = $.parseJSON(xhr.responseText).redirect; 
      if (redirect) { 
       window.location.href = redirect; 
      } 
     } catch (e) { 
      return; 
     } 
    } 
}); 

तो फिर तुम बस जैसे कि निम्न JSON प्रदान करते हैं: https://stackoverflow.com/a/8752354/698289 मैं बहुत उपयोगी हो करने के लिए निम्न कोड पाया ब्राउज़र को रीडायरेक्ट करने के लिए।

ध्यान में रखना है कि $.ajax('complete') चलाता है $.ajax('success') के बाद या $.ajax('error')

+0

मुझे नहीं लगता कि यह एक अच्छा समाधान है। क्या इसका मतलब है कि मुझे इसे हर पृष्ठ पर रखना है? अगर मैं इसे गलत समझता हूं तो कृपया मुझे सही करें। – smwikipedia

+0

उपरोक्त कोड जावास्क्रिप्ट है, और इसलिए केवल तब तक चलेंगे जब तक कि यह आवश्यक प्रत्येक पृष्ठ पर वेब ब्राउज़र में लोड हो। – DanH

2

मैं इस सर्वर की ओर से इस मुद्दे को, और नहीं क्लाइंट साइड पर विचार करें। ब्राउज़र http पर रीडायरेक्शन का पालन न करने के लिए सही है जब यह https द्वारा AJAX अनुरोध करता है, क्योंकि यह एक सुरक्षा दोष होगा।

मुझे एहसास हुआ कि मैं सापेक्ष पथ, जैसे HttpResponseRedirect('/path/to/') का उपयोग कर रहा था। कुछ परत पर, कि यूआरएल http:// उपसर्ग के साथ prepended किया गया था और है कि क्या ब्राउज़र प्राप्त था: http://example.com/path/to/

आपको सुनिश्चित करना होगा कि Locationhttps:// सहित एक पूर्ण पथ, साथ प्रतिक्रिया हेडर में भेजा जाता है।

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