パスエイリアスはリダイレクトループを作成するか、フロントページにリダイレクトします


11

「www.example.com/contact-us」と呼ぶと、次のエラーが発生します。

このリクエストは無限ループを作成しようとしたようです。ここではそのようなことは許可されません。私たちはプロのウェブサイトです!

「www.example.com/node/5」でサイトを呼び出すと、連絡先ページが正常に表示されます。

/ admin / config / search / path / edit / 6でパスエイリアスを確認すると、システムパスとエイリアスが正しく設定されています。

別のエイリアスには別の問題があり、「www.example.com/staff」を呼び出すと、ランディングページ「www.example.com」にリダイレクトされます。もう一度、エイリアスが正しく設定されます。

Drupal 7とi18n_redirectおよびredirectモジュールを使用しています。


私はそれを見つけたと思います:「www.example.com/admin/config/search/redirect」には、それらのURLをリダイレクトするエントリがありました。彼らがどうやってそこに着いたのかはわかりませんが...
Matthias

回答:


19

ページを編集して、URLリダイレクトに移動します。カウントが最も多いリダイレクトパスを見つけて削除します。[保存]をクリックしてページを表示します。

それで問題が解決したかどうかをお知らせください


私は同様の問題を抱えており、これにより個々のノードの問題が修正されますが、そもそもの原因を解明しようとしているので、これは最初から起こりません。
ゴールド

8

更新:Drupalの問題#1796596 は、Redirect 1.0-rc2(2015年6月)にコミットされました。この問題の正しい解決策は、Redirectモジュールの最新の安定リリースにアップグレードしてから、データベースの更新を実行することです。循環リダイレクトは安全にクリーンアップされます。

この問題は、リダイレクトモジュールのバグが原因で発生しました。これをトリガーするには、ページのURL(pathautoを使用している場合は、おそらくそのタイトルのみ)を変更し、それを以前の状態に戻します。

たとえば、「company」というページがあり、タイトルを「Our company」に変更したとします(URLエイリアスがour-companyに変更されました)。その後、私は実際に最初の方法を優先したので、ノードをもう一度編集して、タイトルを「Company」に戻しました。その時点で、エラーメッセージ「このリクエストは無限ループを作成しようとしたようです。ここではそのようなことは許可されていません。私たちはプロのWebサイトです!」が会社のページに表示され始めます。

これを修正するには、最も簡単な方法に応じて、3つの方法があります。彼らは上から下に難易度/勇気の範囲です。

Drupal / PHPメソッド

件名には長いDrupalバグがあります。問題#1796596と、コメント#124に問題を修正する有効なパッチがあります。

うまくいけば、この修正はすぐにダウンロードのためにリダイレクトモジュールにコミットされます。しかし、それは今では1年以上が経過しており、その進展はありません。

SQLメソッド

この問題を解決する最も速い方法は、データベースへのSQLクエリを使用することです。 注意して、この方法は、実行していることがわかっている場合にのみ試してください。最初にサイトの開発用コピーで試してください。ロールバックが必要になった場合に備えて、バックアップがあることを確認し、すぐに変更をテストしてください。i18nを使用している場合は、特に注意して最初のクエリを十分にテストしてください...最初のクエリを実行して、何が削除されるかを示し、2番目のクエリを実行して実際に削除を実行します。

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

パッチの適用方法やSQLクエリの実行方法がわからない場合は、手動で問題を修正する必要があります。心配しないでください。これは実際には非常に簡単です(ただし、他の方法と比較すると時間がかかります)。

手動による方法:

警告メッセージが表示された各ページについて:

  1. ページを編集する
  2. 編集フォームの下部までスクロールします
  3. ページのメインURLに注意してください。「URLパス設定」の下に表示されます。たとえば、「エイリアス:会社」は、ページのURLが「会社」であることを意味します。不明な場合は、[URLパス設定]をクリックしてそのセクションにアクセスし、URLエイリアスを確認できます。
  4. 次に[URLリダイレクト]をクリックします。現在のページへのリダイレクトが表示されます。手順3でメモしたURLエイリアスと同じリダイレクトが少なくとも1つあります。このリストの複数のリダイレクトがURLエイリアスと一致する可能性があります。
  5. URLエイリアスと同じリダイレクトをすべて削除します。これらは、ループの原因となっている問題データと表示されるエラーメッセージです。
  6. 「URLリダイレクト」の下に、URLパス設定の下の問題のあるページのURLエイリアスと完全に一致するリダイレクトがなくなると、エラーメッセージは表示されなくなります。

うまく機能するSQLメソッド!thx
レミー

リダイレクトするパッチは、ほぼリリースの準備ができています。私はそれについて言及すると思いました。
アルフレッドアームストロング

1

ノードのエイリアスに同じredirecsがある場合、このエラーを修正する別の方法は、すべてのnid(ノードの場合)を介してスクリプトを実行し、各ノードのエイリアスに同じ名前のリダイレクトがあるかどうかを確認することです除去されます。

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

このコードは、開発メニューの[PHPコードの実行]オプションで実行できます。

このフォームは「SQLメソッド」に似ていますが、データベースではなくDrupalから実行します。


これは完璧に機能しました!
albertski、2015年


0

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

ファイルに保存しdrush php-script [PATH_TO_SCRIPT]、を使用してサイトのコードベース内から実行すると、URLエイリアスと競合するリダイレクトがすべて削除されます。


0

今後、プロダクションサーバーで「リダイレクトループ」エラーメッセージが表示されないようにするにはどうすればよいですか?このページでエラーレポート「なし」をすでに設定しています-admin / config / development / logging


-2

多くのパッチを適用した後の唯一の方法は、redirect.moduleファイルを開いて#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!');

1
したがって、無限リダイレクトループを修正する代わりに、警告を省略しただけですか?
ジョージ

1
子供の頃(コーディング方法を知る前)にこのようなことをしましたが、専門家としてこれを行うことはお勧めしません。あなたは問題を解決していないだけでなく、何かが間違っているという唯一の指標を隠しています!
コーラン2014

-2

私の英語はあまり上手ではありませんが、私を読んで問題はないと思います。その問題の前に私はそれを解決したので、REDIRECTモジュールを削除しました。KoZnaZnaサイトチーム-Simon様


1
Redirectモジュールを削除しても、その機能が必要な場合は役に立ちません。
コーラン2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.