L'alias de chemin crée une boucle de redirection ou redirige vers la première page

11

Lorsque j'appelle notre sit "www.example.com/contact-us", j'obtiens l'erreur suivante:

Oups, on dirait que cette requête a essayé de créer une boucle infinie. Nous n'autorisons pas de telles choses ici. Nous sommes un site professionnel!

Si j'appelle le site avec "www.example.com/node/5", la page de contact s'affiche très bien.

Lorsque je vérifie l'alias du chemin dans / admin / config / search / path / edit / 6, le chemin du système et l'alias sont correctement définis.

Un autre problème existe pour un autre alias, lorsque j'appelle "www.example.com/staff", je suis redirigé vers la page de destination "www.example.com". Encore une fois, l'alias est correctement défini.

Nous utilisons Drupal 7 et les modules i18n_redirect et redirect.

Matthias
la source
Je suppose que je l'ai trouvé: dans "www.example.com/admin/config/search/redirect", il y avait des entrées redirigeant ces URL. Je ne sais pas comment ils y sont arrivés cependant ...
Matthias

Réponses:

19

Modifiez votre page et accédez aux redirections d'URL . Trouvez le chemin de redirection avec le plus grand nombre de comptes et supprimez-le. Cliquez sur enregistrer puis affichez la page.

Faites-moi savoir si cela a résolu votre problème

Ryan G
la source
J'ai un problème similaire et bien que cela corrige les choses pour les nœuds individuels, j'essaie de comprendre ce qui en est la cause en premier lieu, donc cela ne se produit pas au départ.
Gold
8

Mise à jour: le problème Drupal # 1796596 a été validé à partir de la redirection 1.0-rc2 (juin 2015). La solution correcte à ce problème consiste maintenant à mettre à niveau vers la dernière version stable du module de redirection, puis à exécuter les mises à jour de la base de données. Toutes les redirections circulaires que vous avez seront nettoyées en toute sécurité.

Ce problème est dû à un bogue dans le module de redirection. Vous le déclenchez en changeant l'URL d'une page (ou peut-être simplement son titre, si vous utilisez pathauto), puis en la remettant à ce qu'elle était.

Par exemple, supposons que j'avais une page intitulée "entreprise" et que j'ai changé le titre en "Notre entreprise" (qui a changé l'alias d'URL en notre-entreprise). Ensuite, j'ai décidé que je préférais vraiment la première façon, donc je modifie à nouveau le nœud et change le titre en "Société". À ce stade, le message d'erreur " Oups, on dirait que cette demande a essayé de créer une boucle infinie. Nous n'autorisons pas de telles choses ici. Nous sommes un site Web professionnel! " Commencerait à apparaître sur la page Entreprise.

Il existe trois façons de résoudre ce problème, selon ce qui est le plus simple pour vous. Ils varient en difficulté / bravoure de haut en bas.

La méthode Drupal / PHP

Il y a un long bug Drupal sur le sujet: problème # 1796596 et il y a un bon correctif qui résout le problème dans le commentaire # 124 .

Espérons que ce correctif sera bientôt enregistré dans le module de redirection pour téléchargement. Cependant, cela fait plus d'un an maintenant sans aucun signe de progrès sur ce front.

La méthode SQL

La solution la plus rapide pour le problème est une requête SQL vers la base de données, avec quelque chose comme ci-dessous. Faites attention et n'essayez cette méthode que si vous savez ce que vous faites - essayez-la d'abord sur une copie de développement du site et assurez-vous d'avoir une sauvegarde et de tester les modifications juste après au cas où vous auriez besoin de revenir en arrière. Soyez très prudent et testez très bien la première requête si vous utilisez i18n ... Exécutez la première requête pour afficher ce qui serait supprimé et la seconde pour réellement supprimer.

--Show records to be deleted:
SELECT r.rid, r.language, r.source, r.redirect
  FROM redirect r INNER JOIN url_alias u ON r.source = u.alias
         AND r.redirect = u.source AND r.language = u.language;

--Delete redirects shown in above query:    
DELETE r FROM redirect r INNER JOIN url_alias u ON r.source = u.alias
         AND r.redirect = u.source AND r.language = u.language;

Si vous ne savez pas comment appliquer des correctifs ou exécuter des requêtes SQL, vous devez résoudre le problème manuellement. Ne vous inquiétez pas, cela est en fait assez facile à faire (mais prend du temps par rapport aux autres méthodes):

La méthode manuelle:

Pour chacune des pages où le message d'avertissement s'affiche:

  1. Modifier la page
  2. Faites défiler vers le bas du formulaire d'édition
  3. Notez l'URL principale de la page. Il est affiché sous "Paramètres du chemin URL", par exemple "Alias: entreprise" signifierait que l'URL de la page est "entreprise". Vous pouvez cliquer sur "Paramètres de chemin URL" pour visiter sa section et confirmer l'alias d'URL si vous n'êtes pas sûr.
  4. Cliquez maintenant sur "URL de redirection". Les redirections vers la page actuelle seront affichées. Il y aura au moins une redirection identique à l'alias d'URL que vous avez noté à l'étape 3. Il est possible que plusieurs redirections dans cette liste correspondent à l'alias d'URL.
  5. Supprimez toutes les redirections identiques à l'alias d'URL. Ce sont les données du problème qui provoquent la boucle et le message d'erreur à afficher.
  6. Une fois qu'il n'y a plus de redirections sous "URL de redirection" qui correspondent exactement à l'alias d'URL de la page à problème sous les paramètres de chemin d'URL, le message d'erreur disparaîtra.
Professeur Falken
la source
bonne méthode de travail SQL! thx
rémy
Le patch à rediriger est presque prêt à être publié. Je pensais juste le mentionner.
Alfred Armstrong
1

Si nous avons les mêmes redirecs vers l'alias du nœud, une autre façon de corriger cette erreur est d'exécuter un script qui traverse tout le nid (dans le cas des nœuds) et de voir si l'alias de chaque nœud a une redirection avec le même nom, le cas échéant est éliminé.

for ($i=1; $i<=10000; $i++) {
  $alias = drupal_get_path_alias("node/" . $i);
  $redirect = redirect_load_by_source($alias);
  if ($redireccion->rid> 0) {
    redirect_page_cache_clear($redirect);
    redirect_delete($redireccion->rid);
  }
}

Vous pouvez exécuter ce code dans l'option "Exécuter le code PHP" du menu de développement.

Ce formulaire est similaire à "La méthode SQL", je l'exécute à partir de Drupal et non sur une base de données.

Alfredo Valdivieso
la source
Cela a parfaitement fonctionné!
albertski
0

Créer un script Drush:

<?php
// Set up the query using the database API
$query = db_select('redirect', 'r');
$query->join('url_alias', 'ua', 'r.redirect = ua.source AND r.source = ua.alias');
$query->fields('r', array('rid', 'redirect', 'source'));

// Execute it and fetch the results, one by one
$result = $query->execute();
$any_results = FALSE;
while($r = $result->fetchAssoc()) {
  // For each result, flag we've got at least one result, notify the CLI user
  // of what we're doing, and delete it using Redirect's own API
  $any_results = TRUE;
  drush_log(dt("Deleting unwanted redirect !r (!s -> !t)",
    array("!r" => $r['rid'], "!s" => $r['source'], "!t" => $r['redirect'])), "success");
  redirect_delete($r['rid']);
}

// No results? Report if that's the case
if (!$any_results) {
  drush_log(dt("Nothing to delete!"), "ok");
}

Enregistrez-le dans un fichier et exécutez-le à partir de la base de code de votre site en utilisant drush php-script [PATH_TO_SCRIPT], et il supprimera toutes les redirections qui se heurtent aux alias d'URL.

Vyacheslav Trotsak
la source
0

Comment puis-je empêcher l'affichage du message d'erreur "boucle de redirection" dans le serveur de production à l'avenir? J'ai déjà défini le rapport d'erreur "aucun" sur cette page - admin / config / development / logging

Jose D Jo
la source
-2

Le seul moyen après avoir essayé de nombreux correctifs était d'ouvrir le fichier redirect.module et d'omettre la ligne # 989

drupal_set_message('Oops, looks like this request tried to create an infinite loop. We do not allow such things here. We are a professional website!');
Gaperville
la source
1
Donc, au lieu de corriger la boucle de redirection infinie, vous venez d'omettre l'avertissement?
George
1
Bien que j'aie fait ce genre de chose quand j'étais enfant (avant de savoir coder), je ne recommande pas de le faire à titre professionnel. Non seulement vous ne résolvez pas le problème, mais vous cachez le seul indicateur que quelque chose ne va pas!
colan
-2

Mon anglais n'est pas très bon, mais je pense que vous n'avez pas de problème à me lire. J'ai avant ce problème et je l'ai résolu alors j'ai retiré le module REDIRECT. Cordialement, L'équipe du site KoZnaZna - Simon

Koznazna Sajt
la source
1
La suppression du module de redirection ne vous aidera pas si vous avez besoin de ses fonctionnalités.
colan