2010-06-26 26 views
9

Tengo un documento HTML, que carga contenido de un archivo PHP utilizando una llamada AJAX. La parte importante de mi código es el siguiente:Detectar URL de llamada Ajax

default.html:

/*more code above*/ 
var PHP_URL = "content.php"; 
var Content = document.getElementById('Content'); 
ajaxRequest = new XMLHttpRequest(); 
ajaxRequest.onreadystatechange = 
    function() { 
     if(ajaxRequest.readyState==4) { 
      if (ajaxRequest.status==200) 
       Content.innerHTML = ajaxRequest.responseText; 
      else 
       Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>"; 
      Content.className = "Content Solid"; 
     } 
    } 
ajaxRequest.open("GET",PHP_URL,true); 
ajaxRequest.send(); 
/*more code below*/ 

¿Es posible que el archivo en 'content.php' para detectar que se ha llamado desde 'default.html ', o un documento de llamada diferente según sea necesario?

Respuesta

13

más conocidos frameworks como jQuery y mooTools agregan un encabezado específico que puede verificar con PHP:

if (strcasecmp('XMLHttpRequest', $_SERVER['HTTP_X_REQUESTED_WITH']) === 0) 
{ 
    // Ajax Request 
} 
1

$_SERVER['HTTP_REFERER'] podría ser lo que quieres

Referencia

+1

No puede confiar en que HTTP_REFERER siempre se llene. – Sjoerd

+0

Estoy de acuerdo, pero la única alternativa que se me ocurre es generar un hash único almacenado en la sesión e incluirlo en la solicitud AJAX, luego verificar la sesión del usuario para ver de dónde vino. Eso es feo y probablemente excesivo. –

0

No es posible detectar simplemente que una solicitud provino de una llamada AJAX en el servidor. Sin embargo, podría agregar un parámetro que envíe al solicitarlo a través de AJAX que indique que proviene de una llamada ajax.

Por ejemplo:

/*more code above*/ 
var PHP_URL = "content.php?mode=AJAX"; 
var Content = document.getElementById('Content'); 
ajaxRequest = new XMLHttpRequest(); 
ajaxRequest.onreadystatechange = 
    function() { 
     if(ajaxRequest.readyState==4) { 
      if (ajaxRequest.status==200) 
       Content.innerHTML = ajaxRequest.responseText; 
      else 
       Content.innerHTML = "Error:<br/>unable to load page at <b>"+PHP_URL+"</b>"; 
      Content.className = "Content Solid"; 
     } 
    } 
ajaxRequest.open("GET",PHP_URL,true); 
ajaxRequest.send(); 
/*more code below*/ 

Si simplemente detectar que la llamada es de origen default.html es suficiente (y no distinguir entre una llamada AJAX o un enlace se hace clic), a continuación, comprobar el encabezado de referencia hará el truco , como lo sugirió @Jamie Wong.

2

supongo que lo mejor sería establecer un encabezado de la solicitud en su llamada AJAX, como

st.setRequestHeader('X-Sent-From','default.html') 

después en content.php,

$sentFrom=$_SERVER['HTTP_X_SENT_FROM']; // outputs default.html 
+0

No había pensado en eso - en jQuery, ¿usarías la devolución de llamada 'beforeSend' para hacer esto, o hay una manera más fácil? –

+0

Uso mucho el jQUery, pero no para llamadas AJAX. sin embargo, que yo sepa, usaría beforeSend – fabjoa