サイトのデータベース (Magento ですが、Magento の外部でデータを操作するので関係ありません) に、URL の書き換えでいっぱいのテーブルがあります。このテーブルはかなり前から存在しており、私の URL はその間に複数回変更されています。URLごとに、次のようなものができました。
REWRITES(Request, Target)
really-old-url, old-url
old-url, recent-url
recent-url, current-url
これは期待どおりに動作し、really-old-url
にリダイレクトされますが、 が にリダイレクトされ、さらに にリダイレクトされ、さらに にリダイレクトされた後でcurrent-url
のみ機能します。非常に効率的なセットアップではありません。必要以上の 301 リダイレクトと、ページあたりの db リクエストの増加。最も古い URL と現在の URL の間には 5 つ以上のリダイレクトが存在することが多く、この方法でリダイレクトしているページが何千もあります。really-old-url
old-url
recent-url
current-url
PHP+MySQL を使用してこのテーブルをループし、次のようにします。
REWRITES(Request, Target)
really-old-url, current-url
old-url, current-url
recent-url, current-url
明らかなように、ページの古い URL のいずれかが要求されるたびに、現在の URL に一度だけリダイレクトされます。
どうすればこれを行うことができますか?
編集 - 他の誰かがまったく同じことをしたい場合に備えて、Magento のフィールド名を使用したゴードンからの正解は次のとおりです。
update core_url_rewrite r join (select r.request_path, r.target_path from core_url_rewrite r left outer join core_url_rewrite r1 on r.target_path = r1.request_path where r1.request_path is null) r2 on r.target_path = r2.request_path set r.target_path = r2.target_path;
編集 #2 - このクエリは行でのみ実行しましたis_system = 0
。すべての行を使用すると、予期しない動作が発生する場合があります。