2010-03-02 20 views
19

Mam trudności z pobieraniem żądań AJAX do pracy na serwerze pomostowym. Wszystko działało dobrze na mojej maszynie programistycznej, ale jak tylko ją przesłałem, wszystkie moje żądania AJAX przestały działać. Dowiedziałem się, że jeśli zmienię względne adresy URL (np. "Index.php") na bezwzględne adresy URL ("http://example.com/index.php"), żądania będą działać ponownie, ale nie rozumiem, dlaczego.Względne adresy URL bezwzględne w żądaniach jQuery AJAX

Przykład prośba:

jQuery.post('index.php', {id: 1234, action: 1, step: 1}, function(data) { /* something */ }); 

ten nie działa, ja nawet nie pojawiają się w konsoli Firebug. Jednak jest to tzw. Handler sukcesu, co jest bardzo mylące.

Działa to dobrze:

jQuery.post('http://example.com/index.php', {id: 1234, action: 1, step: 1}, function(data) { /* something */ }); 

Czy ktoś może wyjaśnić dlaczego żądań AJAX zachowują się w ten sposób? x_X

+0

Sprawdź różnicę krótkich tagów php na serwerze lokalnym i publicznym, czasami jest to problem. – Sarfraz

+1

Czy używasz przepisywania adresu URL? W normalnych przypadkach powinno działać zgodnie z powyższym opisem. –

+0

Tak, używam przepisywania adresów URL. Każdy adres URL został przepisany na index.php. Jest to instalacja Typo3 Realurl ... – fresskoma

Odpowiedz

34

Spróbuj dodać / przed index.php w pierwszym przykładzie, aby zmusić go do patrzenia z katalogu głównego. Kliknij dwukrotnie, aby upewnić się, że struktura katalogów jest dokładnie taka sama, jeśli chodzi o lokalizację .

+0

Jeśli to był problem, czy nie powinienem otrzymać odpowiedzi 404? W moim przypadku prośba nie pojawia się nawet w firebugu ... to jest dziwne ... Spróbuję z/choć. – fresskoma

+0

Bez wiedzy o twoim projekcie, nie mogę powiedzieć. – Sampson

3

To jest stary post, więc przykro mi go wyciągnąć. Ale było to oczywiście istotne dla mojego problemu i był to najlepszy wynik w Google.

Po wykonaniu kilku eksperymentów z tym samym problemem ustaliłem odpowiedź.

Nie ważne gdzie jesteś, uruchamiając skrypt z wezwana plik jest w stosunku do/

Na przykład w moim struktury pliku mam folder o nazwie JS. Pod nim jest mój plik ajaxProcess.js. Plik xml, który próbowałem odczytać, znajdował się w tym samym katalogu, więc zgodnie ze standardowymi regułami miał sens, aby URL wywołania ajaxowego był po prostu URL: "myfile.xml" , ale to nie działało.

Po pewnym obejrzeniu umieściłem mój xml w/i ponownie uruchomiłem ajax. Vuala!

Niektóre więcej zabawy, i odkryłem, że nie ma znaczenia, gdzie nazywają js ze w ogóle, to nadal domyślnie/

skończyło się na umieszczenie mojego XML w folderze „xml” i teraz następujące ajax będzie pracować z dowolnego miejsca:

$.ajax({ 
     type:'get', 
     dataType: 'xml', 
     url: 'xml/class.xml', 
     success: function(xml){ 
      $(xml).find('class').each(function(){ 
       //code here 
      }) 
     } 
    }); 
+2

Nie jest względne w stosunku do '/', ale raczej w stosunku do adresu URL znajdującego się w pasku adresu przeglądarki. Jeśli masz wiele poziomów plików HTML w strukturze katalogów, staje się to ważną różnicą. – Paulpro

5

jeśli używasz URL routingu, na przykład w ramach MVC, to zawsze będzie w stosunku do strony realizacja przebiega, co niekoniecznie pasuje do adresu URL w twój pasek adresu.

Rozważmy następującą strukturę plików:

mysite/index.php 
mysite/resources/javascript/my_javascript.js 
mysite/resources/css/my_css.css 

Zazwyczaj MVC ramy trasa wszystkie żądania strony za pomocą jednego pliku, takie jak index.php, (http://www.mysite.com/index.php). Ułatwia to korzystanie z względnych adresów URL, ponieważ zasoby i skrypty zawsze znajdują się na tej samej względnej ścieżce. Javascript będzie zawsze w/resources/javascript/ CSS będzie zawsze w/resources/css/

bez względu na to, co znajduje się w pasku adresu przeglądarki.Może to być:

http://www.mysite.com/index/ 
http://www.mysite.com/kittens/ 
http://www.mysite.com/kittens/cute/ 
http://www.mysite.com/kittens/fluffy/ 
etc.. 
+0

W jaki sposób JavaScript, działający na kliencie, wie o metodzie routingu używanej przez serwer? Klient nie powinien być świadomy, że wszystko dzieje się na przykład przez index.php. – developerbmw

+0

Brett, nie ma. Dlaczego miałbyś tego chcieć? – dalemac

2

Myślę, że najlepszym sposobem, aby uniknąć tego rodzaju problemów jest utworzenie pliku konfiguracyjnego dla JavaSkrypty w głowie HTML. Można to coś takiego w głowie strony:

<script> 
     var url = "http:\/\/www.yourdomain.com\/application"; 
     var path = "\/path\/on\/server\/to root folder"; 
</script> 

Innym podejściem jest dołączenie tych zmiennych do obiektu window:

<script> 
window.myUrl = "http:\/\/www.yourdomain.com\/application"; 
... 
    </script> 

So, później można użyć następujących zmiennych w plikach JS:

jQuery.post(url+'/index.php', {id: 1234, action: 1, step: 1}, function(data) { // something }); 

skrypt w nagłówku może być generowany automatycznie, w oparciu o konfigurację aplikacji, więc gdy aplikacja jest wdrożona adres URL i zmienne ścieżki są odpowiednio zmieniane.