私は、再設計と開発の結果として古い Web サイトから取り残された 30,000 ほどの URL エラーをクリーンアップする任務を負っています。
私は通常、これを行うために .htaccess を使用しますが、.htaccess ファイル内に 30,000 の 301 リダイレクトを含めるのが賢明であるとは思えません!
この問題を解決するために、どのような方法を使用したことがありますか?
前もって感謝します。
ここでApache httpdでできること
RewriteMap escape int:escape
RewriteMap lowercase int:tolower
RewriteMap my_redir_map txt:map_rewrite.txt
RewriteCond ${my_redir_map:${lowercase:${escape:%{HTTP_HOST}%{REQUEST_URI}}}} ^(.+)$
RewriteRule .* http://%1 [R=301,L]
私は通常、この書き換えルールを apache httpd 構成内で直接使用します。
map_rewrite.txt ファイル内には、次の形式のリダイレクトのリストを含むタブ区切りファイルがあります。
www.example.it/tag/nozze www.example.it/categoria/matrimonio
www.example.it/tag/pippo www.example.it/pluto
www.example.it/tag/ancora www.google.com
リダイレクトには共通のパターンがあるため、アプローチを一般化できれば、はるかに簡単になります。ただし、そうでない場合は、リダイレクトされた URL をリストに追加するだけで済みます。リストを別の形式 (データベース テーブルなど) に書き込むこともできるため、RewriteMap 構成をよく調べてください。
これに注意してください: 私が追加escape
しlowercase
たのは、私が書く必要のある URL にアクセントがあるからです。URL にアクセントがない場合は、両方を削除できます。
これらのリダイレクトを php に実装する場合は、次のコードが必要です。
<?php
$dest_url = "http://example.com/path...";
header("HTTP/1.1 301 Moved Permanently");
header("Location: ".$dest_url);
助けてくれてありがとう。freedev から提案された一連のアクションを実行しましたが、Apache 内に別の構成ファイルを作成しました。
httpd.conf ファイル内に次を追加しました。
# Map settings
Include "conf/extra/map.conf"
map.conf ファイル:
RewriteEngine On
RewriteEngine on
RewriteMap url_rewrite_map txt:conf/map.map
RewriteCond ${url_rewrite_map:$1|NOT_FOUND} !NOT_FOUND
RewriteRule ^(.*) http://website.com/${url_rewrite_map:$1} [R=301]
map.map ファイルは次のようにフォーマットされます。
/oldname/ /newname
リダイレクト用にかなりの数の URL を追加しましたが、これまでのところ、.htaccess に追加したときのようにサーバーに大きな影響を与えることはありません。
404 ハンドラーとして動作する PHP ページを作成します。着信 URL を検査し、古いページから新しいページにマップする必要があるかどうかを確認してから、301 を発行します。マッピングがない場合は、404 を提示します。
このページを .htaccess で 404 ハンドラーとして設定するだけで完了です。IIRC これは、IIS7 がサードパーティの dll を必要とせずに URL 書き換えを導入する前に、Wordpress が IIS で「クリーンな」URL を処理するために使用した方法です。
404ページにあるリダイレクトクラスを作成しました。これは、301リダイレクト先の有効なページがあるかどうかをデータベースをチェックし、404ページを提供する代わりにリダイレクトします。それがわからない場合は、データベースで 404 ページとしてマークされるため、後で修正できます。