Detecting ajax request in
PHP is not a very tough task and there are many ways to detect it using client side code, for example, if you send a flag/sign i.e.
http://example.com?isAjax=1 with the request to the server and check it on the server side
if( isset( $_GET['isAjax'] ) && $_GET['isAjax'] ) if that variable exists and contains that variable then you can make sure that the request is made using ajax. You can also set a custom header using
setRequestHeader method and can check on the server side if that header is set or not and this the proper way to do this and this technic is being used by developers. An example is given below
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = handler;
xhr.open("GET", "your_url");
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
In the given example
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); is setting a custom header to the request and you can retrieve this header from the
$_SERVER array using
$_SERVER['HTTP_X_REQUESTED_WITH'] for example, you can check this in
PHP like
if(isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest')
{
// This is an ajax request
}
You can also make function or class method like
function isAjax(){
return isset( $_SERVER['HTTP_X_REQUESTED_WITH'] ) && $_SERVER['HTTP_X_REQUESTED_WITH'] === 'XMLHttpRequest';
}
//You can use it as a function
if( isAjax() )
{
// This is an ajax request
}
Well, this is very simple and this is the most preferable technique that developers use. In this case you don't have to use
HTTP_X_REQUESTED_WITH same header, you can use your own header like
xhr.setRequestHeader('X-Ajax-request', 'XMLHttpRequest') and in
PHP you can use
$_SERVER['HTTP_X_AJAX_REQUEST'] and this will work but you should not use your own, why ? It's because the
X-Requested-With header is not a
HTTP standard header but it's likely a de facto standard, which means this header is being used by developers and many
JavaScript libraries like
jQuery and
Dojo uses this custom header, They send this header with every ajax request and also many
PHP frameworks like
Symphony,
Laravel and
CodeIgniter uses this technic to check the request.
Non-standard header fields were conventionally marked by prefixing the field name with X- . However, this convention became deprecated in June 2012 due to the inconveniences it caused when non-standard headers then became standard. For example, X-Gzip and Gzip are now both supported headers for compressed HTTP requests and responses.
Read more For example, Symphony's
HttpFoundation component contains following public method in the
Request class
public function isXmlHttpRequest()
{
return 'XMLHttpRequest' == $this->headers->get('X-Requested-With');
}
In this case,
Laravel also uses this same technic, because it's depended on
Symphony components and in the the
namespace Illuminate\Http the
Request class is something like this
class Request extends \Symfony\Component\HttpFoundation\Request {
//...
/**
* Determine if the request is the result of an AJAX call.
*
* @return bool
*/
public function ajax()
{
return $this->isXmlHttpRequest();
}
}
Same thing for
CodeIgniter too, in the
system/core/Input.php file there is a method
is_ajax_request() in the
Input class
class CI_Input {
// ...
/**
* Is ajax Request?
*
* Test to see if a request contains the HTTP_X_REQUESTED_WITH header
*
* @return boolean
*/
public function is_ajax_request()
{
return ($this->server('HTTP_X_REQUESTED_WITH') === 'XMLHttpRequest');
}
}
So, we should use the same header that is being used by developer community to keep our code working with any framework or third party libraries. Now, if we use
jQuery or other library which automatically sets the header then we don't have to worry about it but in case we use our own
JavaScript library or vanilla
JavaScript code then we have to set the custom header by ourselves to develop a site/application using these
PHP frameworks. Also, if we don't use these frameworks and instead, if we use plain
PHP code written by ourselves from the scratch, then we can easily adopt this technic by writing the
isAjax() function (given above) in our
PHP file/class and in our
JavaScript code we can set the custom header using
setRequestHeader() function. According to the
RFC-6648 the
X- is deprecated and both
X-REQUESTED-WITH and
REQUESTED-WITH are now supported headers but to maintain the backward compatibility we should use
X-REQUESTED-WITH header in our code like
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'), otherwise our vanilla
Javascript code may not work with many frameworks.
— The End —