Questo codice viene incluso in tutte le pagine che richiedono autenticazione, giusto?

Se si' penso il problema sia in questa linea, che ti fa il redirect server side anche per la AJAX request.

codice:
header("location:index.php");
Invece nel caso di AJAX requests non dovrebbe fare il redirect server side ma ritornare un 401:

codice:
header("HTTP/1.1 401 Unauthorized");
In questo modo puoi poi controllare, col JavaScript che ho scritto prima, che lo status code e' 401 e cosi' puo' fare il redirect client side quando la sessione e' scaduta, altrimenti procede come al solito.

Quindi le cose da fare sono semplicemente due:

1. Far si' che tutte le AJAX requests abbiano un custom header che il PHP puo' poi controllare per sapere appunto se una richiesta e' AJAX:

codice:
$.ajaxSetup({
    beforeSend: function(xhr) {
        xhr.setRequestHeader('HTTP_X_REQUESTED_WITH_AJAX', 'true');
    }
});
(Questo e' soltanto un modo di farlo)

2. Nel PHP controllare se la richiesta e' AJAX. In caso affermativo ritornare un 401 altrimenti fare il redirect alla pagina di login server side:


codice:
<?php




$minutes = 5; //Setta logout in minuti


if (isset($_SESSION["time"])) {
    $sessionTTL = time() - $_SESSION["time"];
    if ($sessionTTL > $minutes * 60) {
        session_unset();
        session_destroy();
        
        if (isset($_SERVER['http_x_requested_with_ajax']) && !empty($_SERVER['http_x_requested_with_ajax']) && strtolower($_SERVER['http_x_requested_with_ajax']) == 'true') {
            header("HTTP/1.1 401 Unauthorized");
        } else {
            header("location:index.php"); //redirect user to a login page or any page to which we want to redirect.
        }
    }
} else {
    session_unset();
    session_destroy();
    
    if (isset($_SERVER['http_x_requested_with_ajax']) && !empty($_SERVER['http_x_requested_with_ajax']) && strtolower($_SERVER['http_x_requested_with_ajax']) == 'true') {
        header("HTTP/1.1 401 Unauthorized");
    } else {
        header("location:index.php"); //redirect user to a login page or any page to which we want to redirect.
    }
}




$_SESSION["time"] = time();


?>

Ovviamente potresti rimuovere duplicazione.

Adesso il PHP sa' quando si tratta di una AJAX request e in tal caso ritorna il famoso 401 che ti serve. Chiaro?