web-dev-qa-db-fra.com

Pourquoi CakePHP génère-t-il des redirections 301 non demandées?

Apparemment au hasard, lorsque j'essaie d'accéder à une page Web (telle que/veut), une autre page Web (telle que/get) du même sous-domaine est chargée en réponse. Cela se produit depuis plusieurs mois sur un ensemble de sites Web que je développe, à la fois dans les versions localhost et de production. J'essayais de l'ignorer comme un hasard bizarre de Firefox, mais j'avais remarqué que la même chose se passait dans la nature sur l'ordinateur d'un autre utilisateur. Je crains maintenant que quoi que ce soit qui se passe ne rende ces sites Web inutilisables pour certaines personnes.

  • Problème de cache: Ceci continue jusqu'à ce que j'efface manuellement le cache de Firefox.
  • RL change: L'URL dans la barre d'adresse devient/get, même si je tape/veux.
  • Pas de code de redirection: Il n'y a rien dans le code frontal ou principal qui redirige l'utilisateur.
  • Contenu non pertinent: L'erreur persiste lorsque le contenu de/veut changer, même si/veut devient une page vierge. Si le contenu de/get change, ces changements s'afficheront et ne constitueront donc pas un instantané statique d'une page en cours de chargement.
  • Firefox uniquement: Je ne l'ai pas remarqué dans aucun autre navigateur, et si Chrome et Firefox tentent tous deux de charger/vouloir en même temps, seul Firefox charge/obtient. J'utilise actuellement Firefox 29.0.1, mais cela se produit également avec les dernières versions.
  • Motif indiscernable: Les deux pages avec lesquelles cela se produit ne sont pas cohérentes, mais elles semblent toujours être des pages que je charge fréquemment et que je navigue directement entre.
  • tilisation de CakePHP: Les sites Web affectés s'exécutent tous dans des sous-répertoires différents de la même installation de CakePHP 2.4.5.

J'ai parcouru Internet en essayant de trouver un indice sur ce qui se passe ou même une description de ce qui se passe pour quelqu'un d'autre, et je suis arrivé vide. Je ne suis même pas sûr de savoir comment tester cela pour déterminer la cause fondamentale du problème ou pour éliminer la possibilité que quelque chose dans le code de mes sites CakePHP en soit la cause.

Mise à jour, après les tests:

Un renifleur de réseau confirme que lorsque j'essaie de charger/je veux, il n'y a qu'une demande pour/obtenir en cours. Cependant, l'exécution d'une demande AJAX pour/veut dans Firebug montre ce qui suit:

GET http://example.com/want 301 Moved Permanently  
Response Headers: Location: http://example.com/get

GET http://example.com/get

Donc Firefox a mis en cache une redirection 301, mais rien dans le code du site Web n’a actuellement ou jamais défini le statut à 301. Firefox semble décider au hasard de mettre en cache les redirections 301 par lui-même. Et aussi de façon incohérente, car parfois ces redirections changent sans que le site Web change ou que le cache de Firefox ne soit effacé.

Les gars, niveau avec moi. Firefox est juste hanté, hein?

Répondre à des questions:

Après avoir effacé le cache de Firefox, cela se reproduira-t-il à un moment donné?
Oui.

sur le même/veux URL? Ou toujours une URL différente/nouvelle?
Parfois les mêmes, parfois différents.

/ veulent et/get ne sont probablement pas liés?
Jusqu'à deux pages sur le même site Web peuvent être.

Vous ne naviguez pas par redirection, par opposition aux liens ordinaires?
Non, juste des liens ordinaires et coller l'URL/vouloir dans la barre d'adresse. La seule chose sur le site qui redirige jamais l'utilisateur vers/get n'est même pas dans/veut, c'est dans ...

Toutes les pages de connexion qui redirigent en cas de succès?
Huh. Eh bien, CakePHP envoie l'utilisateur à travers ces étapes ...

  1. La session de connexion expire
  2. Essayez d'accéder à la page restreinte
  3. Être redirigé vers la page de connexion
  4. Si la connexion est réussie, redirige vers la page restreinte

Par défaut, CakePHP redirige avec code 302 (trouvé/déplacé temporairement) , qui ne devrait pas être mis en cache.
Cependant , je suis à peu près sûr que tous les sites affectés utilisent le composant AutoLogin de plugin CakePHP Utility de milesj , qui - inclut une redirection permanente 301 en cas de connexion automatique réussie . Dans cette ligne, l'utilisateur est redirigé vers la variable 301 vers celle qui est non nulle, dans l'ordre:

  1. la page de renvoi déterminée par les en-têtes
  2. OU la page de référence déterminée par les données de session
  3. OU à une page par défaut "rediriger ici après la connexion" spécifiée par le développeur
  4. OU à la page racine du site (/)

Comme je n’ai jamais spécifié de page "redirection ici après la connexion", tout doit être automatique et envoyer les utilisateurs soit à la page à laquelle ils souhaitent accéder, soit à/après la connexion. La seule façon pour laquelle je peux imaginer ceci/vouloir ->/obtenir un comportement sortant du composant AutoLogin est de savoir si ...

  1. L'utilisateur essaie de charger/veut d'une manière qui n'envoie aucune donnée de référent dans les en-têtes (par exemple, Firefox a été fermé et charge à nouveau les mêmes onglets, ou l'URL est entrée manuellement)
  2. "/ get" reste dans les données de session en tant que référent (c'est le référent le plus récent, par exemple)
  3. Le composant AutoLogin remarque une session arrivée à expiration et connecte l'utilisateur via des données de cookie.
  4. Une fois la connexion établie, le composant AutoLogin effectue une redirection permanente vers/get 301 car il s'agit de la session.
  5. Firefox met en cache la redirection de/veux à/obtenir

En parcourant la base de code de CakePHP, cependant, je n'arrive pas à comprendre comment il gère les données du référent dans la session ni s'il est réellement possible qu'une requête hérite du référant d'une autre requête, ce qui est le seul moyen ce scénario semble être possible.

J'ai créé n problème sur la page GitHub du composant AutoLogin afin qu'une personne plus intelligente que moi puisse, espérons-le, m'aider à évaluer mes soupçons.

2
Phantom Watson

Il semble que ce problème soit causé par un problème (un seul caractère mal orthographié) avec plug-in CakePHP Utility de Milesj , qui a été corrigé .

2
Phantom Watson