views:

65

answers:

4

I have an HTML document, which loads content from a PHP file using an AJAX call. The important bit of my code is below:

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*/

Is it possible for the file at 'content.php' to detect that it has been called from 'default.html', or a different calling document as necessary?

A: 

$_SERVER['HTTP_REFERER'] might be what you want

Reference

Jamie Wong
You can not rely on HTTP_REFERER always being filled.
Sjoerd
Agreed - but the only other alternative I can think of is generate a unique hash stored in the session and include it in the AJAX request then check the user's session to see where it came from. That's kind of ugly and probably overkill.
Jamie Wong
A: 

It is not possible to simply detect that a request came from an AJAX call on the server. You could, however, add a parameter that you send when requesting it via AJAX that indicates it is coming from an ajax call.

For example:

/*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*/

If simply detecting that the call came from default.html is enough (and not distinguishing between an AJAX call or a clicked link), then checking the Referrer header will do the trick, as suggested by @Jamie Wong.

pkaeding
+1  A: 

I guess the best would be to set a request header in your AJAX call, such as

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

then in content.php,

$sentFrom=$_SERVER['HTTP_X_SENT_FROM']; // outputs default.html
fabjoa
Hadn't thought of that - in jQuery, would you use the `beforeSend` callback to do this, or is there an easier way?
Jamie Wong
I use jQUery a lot, but not for AJAX calls. yet, to my knowledge, i would use beforeSend
fabjoa
+1  A: 

Most well-known Ajax frameworks like jQuery and mooTools add a specific header which you can check with PHP:

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