2010-03-02 34 views
19

Me está costando conseguir que mis solicitudes AJAX funcionen en un servidor intermedio. Todo funcionó bien en mi máquina de desarrollo, pero tan pronto como lo cargué, todas mis solicitudes AJAX dejaron de funcionar. Descubrí que, si cambio las URL relativas (por ejemplo, "index.php") a las URL absolutas ("http://example.com/index.php"), las solicitudes vuelven a funcionar, pero no entiendo por qué.URL relativas vs. absolutas en jQuery Solicitudes AJAX

Ejemplo solicitud:

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

Esto no funciona, no tiene ni siquiera aparece en la consola de Firebug. Sin embargo, se llama al controlador de éxito, lo cual es muy confuso.

Esto funciona muy bien:

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

¿Alguien puede explicar por qué peticiones AJAX se comportan de esta manera? x_X

+0

comprobar la diferencia de las etiquetas cortas de php en el servidor local y público, a veces este es el problema. – Sarfraz

+1

¿Está utilizando la reescritura de url? En casos normales, debería funcionar como lo definió anteriormente. –

+0

Sí, estoy usando la reescritura de URL. Cada url se reescribe en index.php. Es una configuración Typo3 Realurl ... – fresskoma

Respuesta

34

Intente agregar / antes de index.php en su primer ejemplo para forzar que se vea desde la raíz. Verifique dos veces para asegurarse de que sus estructuras de directorios sean exactamente lo mismo con respecto a dónde está index.php.

+0

Si este era el problema, ¿no debería obtener una respuesta 404 entonces? En mi caso, la solicitud ni siquiera aparece en firebug ... eso es lo raro ... lo probaré con /. – fresskoma

+0

Sin saber más acerca de su proyecto, no puedo decirlo. – Sampson

3

Esta es una publicación anterior, así que lamento arrastrarla. Pero obviamente fue relevante para mi problema y fue un resultado superior en Google.

Después de experimentar con el mismo problema, he determinado la respuesta.

No importa donde se está ejecutando el script desde el archivo solicitado es relativa a/

Por ejemplo, en mi estructura de archivos que tiene una carpeta denominada JS. Debajo está mi archivo ajaxProcess.js. El archivo xml que estaba tratando de leer estaba ubicado en el mismo directorio, así que siguiendo las reglas estándar tenía sentido que la URL de la llamada ajax fuera simplemente url: 'miarchivo.xml' , sin embargo, esto no funcionó.

Después de jugar un poco, coloqué mi xml en/y ejecuté el ajax nuevamente. Vuala!

Algunos más jugando, y descubrí que no importa donde usted llama desde el js en absoluto, todavía será por defecto/

terminé poniendo mi xml en un 'xml' carpeta y ahora la siguiente ajax funcionará desde cualquier lugar:

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

No es relativo a '/', sino relativo a la URL que está en la barra de direcciones del navegador. Si tiene varios niveles de archivos HTML en su estructura de directorios, esto se convierte en una diferencia importante. – Paulpro

5

si está utilizando enrutamiento de URL, por ejemplo, en un marco de MVC, que siempre será relativo a la página de la ejecución corre a través, que no necesariamente coincide con la dirección URL en su barra de direcciones.

Considérese la siguiente estructura de archivos:

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

Por lo general, los marcos MVC ruta de todas las peticiones de páginas a través de un solo archivo, como index.php, (http://www.mysite.com/index.php). Esto facilita el uso de las URL relativas porque los recursos y las secuencias de comandos siempre estarán en la misma ruta relativa. Javascript siempre estará en/resources/javascript/ CSS siempre estará en/resources/css/

sin importar lo que esté en la barra de direcciones del navegador.Podría ser:

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

¿Cómo sabe JavaScript, que se ejecuta en el cliente, sobre el método de enrutamiento utilizado por el servidor? El cliente no debe saber que todo está pasando por index.php, por ejemplo. – developerbmw

+0

Brett, no es así. ¿Por qué lo querrías? – dalemac

2

creo que la mejor manera de evitar este tipo de problemas es la creación de un archivo de configuración para los javascript en la cabeza de su HTML. Puede incluir algo así en la cabeza página:

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

Otro enfoque es unir estas variables de ventana de objeto:

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

Así, más adelante puede utilizar estas variables dentro de los archivos JS:

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

guión en el encabezado se puede generar automáticamente, en función de la configuración de su aplicación, por lo que cuando se implementa la aplicación url y las variables de ruta se modifican en consecuencia.

Cuestiones relacionadas