Alias ​​ścieżki tworzy pętlę przekierowań lub przekierowuje na stronę główną

11

Kiedy dzwonię do naszej witryny „www.example.com/contact-us”, pojawia się następujący błąd:

Ups, wygląda na to, że to żądanie próbowało utworzyć nieskończoną pętlę. Nie zezwalamy na takie rzeczy tutaj. Jesteśmy profesjonalną stroną internetową!

Jeśli zadzwonię do witryny pod adresem „www.example.com/node/5”, strona kontaktu zostanie wyświetlona w porządku.

Kiedy sprawdzam alias ścieżki w / admin / config / search / path / edit / 6, ścieżka systemowa i alias są ustawione poprawnie.

Kolejny problem istnieje w przypadku innego aliasu, gdy dzwonię „www.example.com/staff”, zostajesz przekierowany na stronę docelową „www.example.com”. Ponownie alias jest ustawiony poprawnie.

Używamy Drupal 7 oraz modułów i18n_redirect i redirect.

Matthias
źródło
Myślę, że go znalazłem: w „www.example.com/admin/config/search/redirect” były wpisy przekierowujące te adresy URL. Nie wiem jednak, jak się tam dostali ...
Matthias

Odpowiedzi:

19

Edytuj swoją stronę i przejdź do przekierowań adresów URL . Znajdź ścieżkę przekierowania o największej liczbie zliczeń i usuń ją. Kliknij przycisk Zapisz, a następnie wyświetl stronę.

Daj mi znać, czy to rozwiązało problem

Ryan G.
źródło
Mam podobny problem i chociaż to naprawia rzeczy dla poszczególnych węzłów, staram się dowiedzieć, co go powoduje, więc nie zawsze tak jest.
Złoto
8

Aktualizacja: Problem Drupal nr 1796596 został popełniony od wersji przekierowania 1.0-rc2 (czerwiec 2015). Prawidłowym rozwiązaniem tego problemu jest teraz aktualizacja do najnowszej stabilnej wersji modułu Przekierowanie, a następnie uruchomienie aktualizacji bazy danych. Wszelkie przekierowania okrężne zostaną bezpiecznie usunięte.

Ten problem pojawił się z powodu błędu w module przekierowania. Wywołujesz go, zmieniając adres URL strony (a może po prostu jej tytuł, jeśli używasz pathauto), a następnie zmieniając go z powrotem na poprzedni.

Załóżmy na przykład, że mam stronę o nazwie „firma” i zmieniłem tytuł na „Nasza firma” (która zmieniła alias adresu URL na naszą firmę). Potem zdecydowałem, że tak naprawdę wolę ten pierwszy sposób, więc ponownie edytuję węzeł i zmieniam tytuł z powrotem na „Firma”. W tym momencie komunikat o błędzie „ Ups, wygląda na to, że to żądanie próbowało utworzyć nieskończoną pętlę. Nie zezwalamy na takie rzeczy tutaj. Jesteśmy profesjonalną stroną internetową! ” Zacznie się pojawiać na stronie firmy.

Istnieją trzy sposoby rozwiązania tego problemu, w zależności od tego, co jest dla ciebie najłatwiejsze. Różnią się poziomem trudności / odwagą od góry do dołu.

Metoda Drupal / PHP

Jest długi błąd Drupala na ten temat: Problem # 1796596 i jest dobra działająca łatka, która naprawia problem w komentarzu # 124 .

Mam nadzieję, że ta poprawka wkrótce zostanie zatwierdzona w module Przekierowanie do pobrania. Jednak minął już ponad rok i nie widać żadnych postępów w tej dziedzinie.

Metoda SQL

Najszybszym rozwiązaniem problemu jest zapytanie SQL do bazy danych, z czymś takim jak poniżej. UWAŻAJ i wypróbuj tę metodę tylko wtedy, gdy wiesz, co robisz - wypróbuj ją najpierw w kopii rozwojowej witryny i upewnij się, że masz kopię zapasową, a następnie przetestuj zmiany na wypadek, gdybyś musiał wycofać się. Zachowaj szczególną ostrożność i dobrze przetestuj pierwsze zapytanie, jeśli używasz i18n ... Uruchom pierwsze zapytanie, aby pokazać, co zostanie usunięte, a drugie, aby faktycznie usunąć.

--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;

Jeśli nie wiesz, jak zastosować poprawki lub uruchomić zapytania SQL, musisz rozwiązać problem ręcznie. Nie martw się, w rzeczywistości jest to dość łatwe (ale czasochłonne w porównaniu do innych metod):

Metoda ręczna:

Dla każdej strony, na której wyświetlał się komunikat ostrzegawczy:

  1. Edytuj stronę
  2. Przewiń na dół formularza edycji
  3. Zanotuj główny adres URL strony. Jest pokazany pod „Ustawieniami ścieżki URL”, np. „Alias: firma” oznacza, że ​​URL strony to „firma”. Możesz kliknąć „Ustawienia ścieżki URL”, aby przejść do jej sekcji i potwierdzić alias adresu URL, jeśli nie jesteś pewien.
  4. Teraz kliknij „Przekierowania URL”. Zostaną wyświetlone przekierowania do bieżącej strony. Będzie co najmniej jedno przekierowanie, które jest takie samo jak alias adresu URL zanotowany w kroku 3. Możliwe jest, że więcej niż jedno przekierowanie na tej liście będzie pasowało do aliasu adresu URL.
  5. Usuń wszystkie przekierowania, które są takie same jak alias adresu URL. Są to dane problemowe, które powodują wyświetlenie pętli i komunikat o błędzie.
  6. Gdy w sekcji „Przekierowania URL” nie będzie już żadnych przekierowań, które dokładnie pasują do aliasu URL strony problemowej w ustawieniach ścieżki URL, komunikat o błędzie zniknie.
Profesor Falken
źródło
dobra działająca metoda SQL! thx
rem
Łatka do przekierowania jest prawie gotowa do wydania. Pomyślałem, że o tym wspomnę.
Alfred Armstrong,
1

Jeśli mamy takie same przekierowania do aliasu węzła, innym sposobem naprawienia tego błędu jest uruchomienie skryptu, który przejdzie przez cały identyfikator nid (w przypadku węzłów) i sprawdzi, czy alias każdego węzła ma przekierowanie o tej samej nazwie, jeśli istnieje jest wyeliminowany.

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);
  }
}

Możesz uruchomić ten kod w opcji „Wykonaj kod PHP” z menu programowania.

Ta forma jest podobna do „metody SQL”, po prostu wykonuję ją z Drupala, a nie z bazy danych.

Alfredo Valdivieso
źródło
To działało idealnie!
albertski
0

Utwórz skrypt 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");
}

Zapisz go w pliku i uruchom za pomocą bazy kodów witryny drush php-script [PATH_TO_SCRIPT], a spowoduje to usunięcie wszelkich przekierowań, które kolidują z aliasami adresów URL.

Wiaczesław Trotsak
źródło
0

Jak mogę zapobiec wyświetlaniu komunikatu o błędzie „pętla przekierowania” na serwerze produkcyjnym w przyszłości? Na tej stronie ustawiłem już raportowanie błędów „brak” - admin / config / development / loging

Jose D Jo
źródło
-2

Jedynym sposobem po wypróbowaniu wielu poprawek było otwarcie pliku redirect.module i pominięcie wiersza # 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
źródło
1
Więc zamiast naprawić nieskończoną pętlę przekierowania, po prostu pominąłeś ostrzeżenie?
George
1
Chociaż robiłem takie rzeczy, gdy byłem dzieckiem (zanim wiedziałem, jak kodować), nie polecam robić tego w celach zawodowych. Nie tylko nie rozwiązujesz problemu, ale ukrywasz jedyny wskaźnik, że coś jest nie tak!
colan
-2

Mój angielski nie jest zbyt dobry, ale myślę, że nie masz problemu ze mną przeczytać. Mam przed tym problemem i rozwiązałem go, więc usunąłem moduł REDIRECT. Pozdrawiam Zespół strony KoZnaZna - Simon

Koznazna Sajt
źródło
1
Usunięcie modułu Przekierowanie nie pomoże, jeśli potrzebujesz jego funkcji.
colan