2009-12-26 3 views
1

Je suis en train de mettre en place un système de slug pour mon site web. Je prévois de rediriger les slugs invalides vers le bon qui est stocké dans la base de données. E.g.Comment identifier si referrer est une redirection 301

http://example.com/11/wrong-slug

Hit db, vérifier si la limace de 11 est erroné limace sinon faire 301 redirigent

http://example.com/11/right-slug

Detect 301 et informer l'utilisateur qu'ils ont suivi un lien non valide

Est-il possible d'identifier la redirection 301 de préférence en utilisant PHP, donc je peux demander à l'utilisateur de mise à jour là signet etc.

Merci, Jamie.

+0

Pourquoi avez-vous choisi la réponse de Gordon? – Gumbo

+0

Consultez ma solution proposée à: http://stackoverflow.com/questions/1178405/how-can-i-detect-if-page-was-requested-via-a-redirect/18375175#18375175 –

Répondre

2

Plusieurs solutions viennent à l'esprit:

  1. Vous pouvez essayer avec get_headers()ah non, il envoie une requête à l'URL, ce qui est pas ce que vous voulez

  2. Puisque vous redirigent et testent la redirection à partir de la même machine de toute façon, vous pouvez simplement écrire un message sur le mauvais slug dans la session de l'utilisateur et l'afficher la prochaine fois que le modèle de vue est rendu. De nombreux frameworks ont un composant flash messenger, qui vous permet de le faire facilement, par ex. avec Zend Framework vous utiliserez le code suivant dans votre action de contrôleur

    $ flashMessenger = $ this -> _ helper-> getHelper ('FlashMessenger'); $ FlashMessenger-> addMessage ('Nous avons fait quelque chose dans la dernière requête'); Au lieu de rediriger immédiatement lorsqu'un slug erroné est trouvé, vous venez de rendre un modèle View qui informe votre utilisateur du mauvais slug, puis d'utiliser une redirection meta ou javascript du template. En option, vous pouvez également écrire un lien simple avec le slug droit au modèle. Enfin, vous pouvez également injecter un en-tête personnalisé dans la redirection via header(), qui peut ensuite être lu à partir de votre script.ne fonctionnera pas non plus, car ils seront perdus une fois que le navigateur a la redirection du serveur

+0

Donc, je pourrais utiliser get_headers (url) pour retourner le statut de la page en cours. Cependant, je ne vois pas comment je pourrais utiliser cela pour détecter s'ils ont déjà été redirigés. Je pense que je pourrais ajouter un drapeau à l'URL redirigée. Mais encore une fois, cela conduirait à plus de problèmes. –

+0

Je me suis trompé, get_headers() n'est pas ce que vous cherchez, mais vérifiez la réponse mise à jour pour d'autres solutions possibles. – Gordon

1

Une solution pourrait être de vérifier la $_SERVER['HTTP_REFERER'] dans la page « nouveau »: si elle est définie et correspond à la "vieille" page, c'est probablement parce que votre utilisateur a été redirigé - ce qui signifie que vous pourriez vouloir afficher votre message. Mais notez que le Referer est envoyé par le navigateur de l'utilisateur, et peut être désactivé ou falsifié - donc il est bon de l'utiliser pour améliorer l'expérience, mais vous ne devez pas compter sur lui pour quelque chose de critique.

+0

Juste essayé cette méthode, un refender vide est retourné lors de la visite de la page redirigée. –

+0

Ho, dommage - J'ai fait un test rapide ici, et il semblait fonctionner :-( –

+0

Je l'ai fait: en-tête ("HTTP/1.1 301 déplacé en permanence"); header ("Lieu: http: // www.google.com "); puis javascript: alert (document.referrer); Comment avez-vous fait cela? –

5

Vous pouvez également ajouter un paramètre GET à votre URL (si cela ne vous dérange pas), et vérifiez-le dans votre script PHP.Quelque chose comme:

http://example.com/11/right-slug?corrected-from=http://example.com/11/wrong-slug 

Sur la même note, vous pouvez utiliser la session ou les cookies, mais vous devez prendre soin de les enlever après la détection.

+0

Vous allez bien sûr vouloir encoder ce paramètre, mais cela semble plus simple que de se fier à un le navigateur pourrait choisir d'envoyer – kdgregory

+0

En ajoutant le paramètre supplémentaire, l'URL changerait de nouveau à partir de http: // example.com/11/right-slug afin qu'il se boucle sur lui-même. Je pourrais utiliser une session si (invalide) {session(); rediriger}) pourrait être le temps que j'ai appris sur les sessions! –

+0

Je ne suis pas sûr de la façon dont vous choisissez vos redirections, mais en général, vous ne regardez que la partie de l'URI jusqu'à la chaîne de requête. – kdgregory

0

trouvé une solution de travail:

  • session de démarrage.
  • Check session, si $ _SESSION [ 'INVALID_SLUG'] existe un message d'affichage puis la session unset

    autre

  • slug retreive base de données par exemple/11/right-slug
  • Récupère l'adresse URI actuelle, par ex./11/faux-limaces
  • Comparez, si différent set $ _SESSION [ 'INVALID_SLUG'] et pour corriger la page de redirection

Tous les commentaires? Je me rends compte que cela ne détectera pas une redirection 301 elle-même plus détecter un déclencheur assosié à la redirection.

Merci pour toute l'aide.

+0

Gardez à l'esprit que les sessions peuvent ne pas fonctionner (les cookies de l'utilisateur sont désactivés/bloqués), la solution GET est plus fiable. Si votre page repose sur des sessions de travail, ce n'est pas un gros problème. – mjy

+0

Il est impossible de détecter une redirection 301, car une redirection n'est rien d'autre que de dire au navigateur de faire la même requête à une URL différente. La deuxième requête ne contiendra aucune information sur les demandes précédentes si vous ne l'ajoutez pas vous-même (paramètre de requête, session, cookie, etc.). –

+0

C'est ce que j'ai suggéré comme solution # 2 dans ma réponse. – Gordon

0

Je pense que la seule option utile est d'utiliser un cookie.

Quand une URL avec la mauvaise limace est demandée, définissez un cookie pour cette URL sans la limace:

$path = substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/')+1); 
setcookie('wrong-slug', 1, 0, $path); 

Ensuite, tester si un tel cookie existe et afficher votre message:

if (isset($_COOKIE['wrong-slug'])) { 
    echo 'The location of this resource has changed. Please update your bookmarks.'; 
}