2011-08-05 17 views
17

Używam jQuery 1.6.2 do żądania POST AJAX do strony w tej samej domenie. Ta strona przekierowuje 302 na inną stronę.W wywołaniu AJAX, 302 nie jest śledzony

Teraz na mojej lokalnej maszynie działa to dobrze, ale na naszym serwerze produkcyjnym przekierowanie nie jest przestrzegane, a w inspektorze Chrome żądanie jest "anulowane".

Jeśli odwiedzam tę samą stronę, bez angażowania JavaScript, wszystko działa dobrze, a jak powiedziałem AJAX działa na moim komputerze lokalnym, ale nie na serwerze produkcyjnym.

Czy ktoś wie, co może spowodować?

Istnieją pewne różnice między serwerami (OS X, Apache2, PHP5.3.6, HTTP na komputerze lokalnym, Ubuntu, Lighttpd, PHP5.3.3, HTTPS przy produkcji), ale żaden z nich nie powinien mieć znaczenia.

+1

Zakładam przekierowania 302 do innego zasobu w tej samej domenie? –

+0

Rzeczywiście. Okazuje się, że w kohanie był błąd, który powodował, że przekierowanie było HTTP zamiast HTTPS. To musiało spowodować, że przeglądarka anulowała żądanie. – Johan

+3

Doskonały. Dodaj to jako odpowiedź poniżej - za dwa dni będziesz w stanie zaakceptować swoją odpowiedź jako poprawną, aby ludzie, którzy mają podobne problemy w przyszłości, mogli ją znaleźć. –

Odpowiedz

11

Okazuje się, że to błąd w kodzie spowodował przekierowanie przekierowanie, aby przejść na stronę http: // gdy strona, która została wezwana była https: //. To sprawia, że ​​przeglądarka nie stosuje się do przekierowania.

+1

Więc w ten sposób rozwiązujesz swoje pytanie, podobnie jak ja również. –

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

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

następujące pytania związane z twoją odpowiedzią. możesz znaleźć odpowiedź poniżej linków.

Catching 302 FOUND in JavaScript

How to manage a redirect request after a jQuery Ajax call

+4

Przeglądarki nie powinny przekazywać 302 do JS, ponieważ przeglądarka obsługuje przekierowanie w sposób przezroczysty, więc jQuery nigdy się nie dowie, że zostało przekierowane. Nie jestem pewien, czy to są wszystkie przeglądarki, jednak Chrome wyraźnie robi to w ten sposób, a inne tak samo zgłosiły Opera/FF. – DanH

+0

"Przeglądarki nie powinny przekazywać 302 do JS" nie oznacza, że ​​musisz głosować w dół odpowiedź. spróbuj powyższego kodu siebie, a następnie umieścić poprawną odpowiedź, jeśli jest to złe, zamiast głosowania bez wiedzy. i zobacz 3 wtrącenia, a także –

+6

'xhr.status == 302' nigdy nie powinno się zdarzyć, ponieważ 302 będzie obsługiwane przez przeglądarkę, która następnie zwróci tylko 200 lub inny kod błędu do JS, więc uważam to za nieproduktywną radę . Usuwam -1, ponieważ łączysz się z innymi pytaniami. Przekażę inną odpowiedź. – DanH

2

Na podstawie tej odpowiedzi: https://stackoverflow.com/a/8752354/698289 znalazłem poniższy kod, żeby być bardzo przydatne:

$('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; 
     } 
    } 
}); 

Wtedy po prostu dostarczyć JSON, takich jak:

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

a ajaxComplete zadba przekierować przeglądarkę.

Należy pamiętać, że $.ajax('complete') wyzwala PO $.ajax('success') lub $.ajax('error')

+0

Nie sądzę, że to dobre rozwiązanie. Czy to znaczy, że muszę umieścić to na każdej stronie? Proszę mnie poprawić, jeśli rozumiem to źle. – smwikipedia

+0

Powyższy kod to JavaScript, więc będzie działał tylko pod warunkiem, że jest załadowany w przeglądarce na każdej stronie, która jest wymagana. – DanH

2

uważam, że jest to problem po stronie serwera, a nie po stronie klienta. Przeglądarka jest poprawna, aby nie śledzić przekierowań do http, gdy wysyła zapytanie ajax przez https, ponieważ byłaby to luka w zabezpieczeniach.

Zdałem sobie sprawę, że używałem ścieżek względnych, takich jak HttpResponseRedirect('/path/to/'). Na jakiejś warstwie, że był poprzedzany URL z prefiksem http:// i że właśnie otrzymał przeglądarka: http://example.com/path/to/

Należy upewnić się, że Location zostanie wysłane w nagłówku odpowiedzi z pełną ścieżką, w tym https://.

Powiązane problemy