0 votes

PHP HTTP_REFERRER - comment détecter la dernière page ?

Je dois détecter l'endroit où l'utilisateur vient de cliquer, car mon contenu AJAX doit être affiché différemment en fonction de la page source dans laquelle il doit être inséré.

S'il doit être inséré dans about.php, il ne doit contenir que des données, mais s'il doit être inséré dans about-main.php, il doit contenir toute la colonne centrale et doit donc être entouré d'un en-tête et d'un pied de page.

Le code HTML appelé via AJAX est contenu dans une page php qui utilise ce code pour savoir qui pose la question, puis formate la réponse HTML de manière appropriée.

$array[] = "/cf/about.php";
$array[] = "/cf/about/about-main.php";
$array[] = "/cf/about/other-page.php";

$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] != $value) {
        $ispage = "";
    } else {
        $ispage = "woot";
    }
}
if ($ispage == "woot") {
        echo $content;
    } else {
        include_once 'about-header.php';
        echo $content;  
        include_once 'about-footer.php';
}

Le problème est que... HTTP_REFERER semble être un peu aléatoire. Il fonctionne parfaitement lorsque je suis au travail sur le réseau, mais je l'ai essayé sur mon ordinateur à la maison et il est évident qu'il ne fonctionne pas du tout - les résultats sont horribles :o

Existe-t-il un autre moyen d'y parvenir ? Je suppose que l'on pourrait utiliser des variables de session, mais je n'ai pas beaucoup d'expérience dans ce domaine !

Tous les conseils sont les bienvenus ;) Merci !

éditer :

La page est en fait une page de profil du personnel. Son emplacement normal est about.php et la div de la deuxième colonne affiche une grille de vignettes qui, lorsqu'elles sont cliquées, chargent le profil à cet endroit via AJAX. Tout est simple et agréable - le bouton "retour" recharge la grille de photos.

Le problème est que chaque membre du personnel a également besoin d'une page statique. Je les ai créées à about/staff-name.php. Le contenu est cependant LE MÊME. Je veux que le serveur détecte si quelqu'un est venu directement sur la page about/staff-name.php et si c'est le cas, qu'il l'entoure d'un header/footer.

Si la requête provient de la grille de photos (c'est-à-dire AJAX), elle n'a pas besoin de l'en-tête/pied de page.

Est-ce que c'est clair ? :o

1) Si requête AJAX - pas de wrapper 2) S'il n'y a pas de requête AJAX - ajouter un wrapper d'en-tête/pied de page

3voto

Vex Points 618

Ne serait-il pas plus simple de passer un drapeau dans votre appel AJAX pour indiquer au script quel type de contenu afficher ?

Edit:

Le fichier about/staff-name.php affiche donc le contenu. Appelez-le via AJAX en tant que about/staff-name.php?FromAjax=1

Ensuite, dans le fichier about/staff-name.php :

if (isset($_REQUEST['FromAjax']) ) {
    echo $content;
} else {
    include_once 'about-header.php';
    echo $content;  
    include_once 'about-footer.php';
}

3voto

Pascal MARTIN Points 195780

Quoi qu'il en soit, le Referer n'est pas une information sur laquelle vous devriez baser tout votre site web : il est envoyé par le client, ce qui signifie (au moins) :

  • le client ne doit pas nécessairement l'envoyer
    • il peut être désactivé dans le navigateur
    • certains pare-feu / antivirus le suppriment
  • il peut être falsifié / altéré (un moyen facile avec firefox est d'utiliser une extension pour le faire)

Vous devez absolument trouver un moyen plus efficace, plus économique et plus fiable de faire ce dont vous avez besoin.

Une solution (que vous avez déjà rejetée) serait de passer une information supplémentaire dans tous vos liens, indiquant de quelle page provient la requête. A mon avis, ce serait probablement la meilleure chose à faire...

Peut-être qu'un moyen plus simple serait d'ajouter un paramètre à votre requête Ajax, indiquant d'où elle provient ? Par exemple, au lieu de se fier au Referer dans le script PHP, il suffirait de regarder un paramètre dans la requête, qui agirait comme une "sorte de referer", mais mis par vous ?

Il ne sera pas plus sûr (les utilisateurs pourraient toujours falsifier les demandes, avec ce paramètre) mais, au moins, il ne serait pas désactivé / modifié (sauf si l'utilisateur le fait à la main)


En fin de compte, vous dites aussi ceci :

1) Si requête AJAX - pas de wrapper
2 pas une requête AJAX - ajouter un en-tête/pied de page de l'en-tête/du pied de page

S'il s'agit seulement de déterminer si le script PHP a été appelé par une requête Ajax, là aussi, deux solutions :

  • Ajouter un paramètre à la requête lorsqu'elle est effectuée via Ajax (vous n'ajoutez ce paramètre que dans le JS script qui effectue la requête ; et lorsque le paramètre est ici, PHP sait qu'il s'agit d'une requête Ajax).
  • Ou, dans le script PHP script, recherchez un élément de type X-Requested-With L'en-tête HTTP, qui est souvent ici avec la valeur XMLHttpRequest lorsqu'une demande est faite par le biais d'un appel Ajax. (Mais vous devriez vérifier que c'est défini avec votre JS Framework / ou peut-être que cela dépend du navigateur - je n'en suis pas sûr :-( )

1voto

Tom Haigh Points 32314

Pourquoi ne pas créer les pages statiques sur le serveur sans utiliser ajax, y compris l'en-tête, le pied de page et le profil ? Si la page est statique, vous ne devriez pas avoir besoin de charger le contenu à l'aide de javascript.

Si vous avez besoin de le charger à l'aide de javascript, la solution de Vex est bonne. Vous pourriez passer des paramètres optionnels dans l'appel ajax qui contrôlent la manière dont la page est rendue - de cette manière, la page incluse n'a pas besoin de connaître les pages qui l'utilisent, elle doit juste comprendre les paramètres qui lui indiquent comment se rendre elle-même. Vous pouvez ainsi la réutiliser plus facilement à l'avenir.

J'ai toutefois remarqué une erreur dans votre code - cela ne fonctionnera probablement pas comme prévu :

$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] != $value) {
        $ispage = "";
    } else {
        $ispage = "woot";
    }
}

Si un nom de page est trouvé, mais que le suivant ne l'est pas, $ispage sera remis à ''. Vous feriez probablement mieux de faire quelque chose comme :

$ispage = "";
foreach ($array as $value) {
    if ($_SERVER['HTTP_REFERER'] == $value) {
        $ispage = "woot";
        break;
    }
}

o

$ispage = '';
if (in_array($_SERVER['HTTP_REFERER'], $array)) {
    $ispage = 'woot';
}

0voto

MrFidge Points 1232

Tai kucing -

Si vous mettez en forme vos liens de cette manière :

<a href="http://www.this-is-a-link.html?setvariablehere=yes">link</a>

Dans ce cas, il suffit que le php soit le suivant :

if (isset($_REQUEST['setvariablehere']) ) {
    do something for when variable IS set
} else {
    do something for when variable IS NOT set
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X