web-dev-qa-db-ja.com

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

「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モジュールとリダイレクトモジュールを使用しています。

11
Matthias

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

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

19
Ryan G

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

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

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

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

Drupal/PHPメソッド

長いDrupalこの件に関するバグ: Issue#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エイリアスと完全に一致するリダイレクトがなくなると、エラーメッセージは表示されなくなります。
8

ノードのエイリアスに同じ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);
  }
}

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

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

1

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

0
Jose D Jo

修正して循環リダイレクトを防ぐ でパッチを適用します(またはモジュールに到達するまで待ちます)。

0
colan