web-dev-qa-db-fra.com

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

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.

11
Matthias

Modifiez votre page et accédez à RL de redirection. 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

19
Ryan G

Mise à jour: Drupal # 1796596 a été validé à partir de la redirection 1.0-rc2 (juin 2015). La solution correcte à ce problème est maintenant de passer à la dernière version stable du module de redirection, puis d'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 Drupal bug sur le sujet: Issue # 1796596 et il y a un bon patch 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. 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 un sauvegarder et 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 de 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ît.
8
Professor Falken

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 PHP Code" du menu de développement.

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

1
Alfredo Valdivieso

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 à l'aide de drush php-script [PATH_TO_SCRIPT], et il supprimera toutes les redirections en conflit avec les alias d'URL.

0
Vyacheslav Trotsak

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

0
Jose D Jo

Appliquez le patch sur Corrigez et empêchez les redirections circulaires (ou attendez qu'il arrive dans le module).

0
colan