私はこの古いウェブサイトの URL 構造を持っています:
site.com/folder/prod.php?cat=MAIN%20CAT%20&prodid1=123&prodtitle=PROD%20TITLE&subcat=SUB%20CAT
実際の例は次のようになります。
site.com/folder/prod.php?cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS
ここで、製品ページには、カテゴリ、製品 ID、製品タイトル、およびサブカテゴリの 4 つの変数があることがわかります。この変数の一部は、メニューを開くために使用されました。はい、URL は、スペースと小文字と大文字の両方を含む変数を取得します。
新しいサイトの URL は新しい構造になっています。
site.com/x/product-title-prodid2
rel の例は次のようになります。
site.com/x/mtx-amps-8888
これは、2 つの変数 (わかりやすいスラッグ + 2 番目の製品 ID: prodid2) を .htaccess 内の次のコードで使用することによって実現されます。
<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteRule ^p/(.*)/$ product.php?prodid2=$1
RewriteRule ^p/(.*)$ product.php?prodid2=$1
</IfModule>
内部的には、同じテーブルから prodid1 がある場合、prodid2 を取得できますが、その逆はできません。
すべて正常に動作しますが、301 リダイレクトを作成する必要があります。どうやら同じ変数が古い URL と新しい URL で使用されていないため、Nice URL の作成と 301 に対して単一のルールを作成する必要があるように見えるため、注意が必要です。
htaccess に以下を追加してみました。
RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]
1つの製品のみで機能しますが、2つ以上追加するとサイトがダウンします. これは無限ループになると思いますか?
別の方法として、次を追加します。
ErrorDocument 404 /404.php
URL を取得してページにリダイレクトしますが、これは SE にとって見苦しいものです。
アップデート:
このトピックに関する私の理解不足で申し訳ありませんが、これは非常に新しいものです。
製品には 2 つの重要な ID があります。例えば:
MTX AMP (実際の製品名) が 3 つのカテゴリにリストされている場合、1 つの prodid2 が繰り返され、3 つの異なる prodid1 (各カテゴリに 1 つ) が含まれます。それらはすべて同じテーブルに存在します。したがって、prodid1 がある場合、db テーブルでそのすぐ隣にある prodid2 を取得できます。
新しいサイトでナイス URL を取得するためのルールは、prodid2 を使用してプルされます。
RewriteRule ^p/(.*)$ product.php?prodid2=$1
これにより、データベースに格納された完全な値が得られます。例 mtx-amps-8888 << これはスラッグと prodid2 の組み合わせです
完全な URL は次のとおりです。
site.com/p/mtx-amps-888
(p は単なる仮想フォーダーであり、その変数を利用して適切なページ テンプレートを表示します)
したがって、mtx-amps-888 は 3 つのキーではありません。これらは製品の作成時に生成され、データベース内の 1 つのフィールドにまとめて保存されます。それらにはすでに分離が含まれているため、これは htaccess では行われません。
cat (キー) 値は、実際には古いサイトで使用されていたメニューを展開するために使用されますが、301 リダイレクトを作成するには、その値を一致させて prodid2 を取得できるため、おそらく prodid1 を使用します。prodid2 は、新しいサイトでナイス URL を取得するためのメイン クエリとして使用され、その値はデータベースに格納されているナイス URL を取得します。
私のすべての研究から理にかなっているのは、次のことです。
<IfModule mod_rewrite.c>
Options +Indexes
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
RewriteRule ^p/(.*)$ product.php?prodid2=$1
RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=4444&prodtitle=MTX%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]
RewriteCond %{QUERY_STRING} ^cat=CAR%20AUDIO&prodid1=5555&prodtitle=BOSS%20AMPS&subcat=AMPS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]
RewriteCond %{QUERY_STRING} ^cat=CAR%20VIDEO&prodid1=6666&prodtitle=ALPINE%20DVDS&subcat=DVD%20PLAYERS$ [NC]
RewriteRule ite.com/folder/prod.php site.com/x/mtx-amps-8888? [R=301,L]
</IfModule>
Pls は、メインの書き換えルールから次の行を削除したことに注意してください。
RewriteRule ^p/(.*)/$ product.php?prodid2=$1
これは、ユーザーが URL の最後で / も使用できることを保証するだけです: site.com/p/mtx-amps-888/
3 つの製品の 301 リダイレクトの書き換え条件も繰り返しましたが、実際にここにリストする製品は約 3K あります。1 のままでも機能しますが、2 を追加するとループが作成されると思います。
うまくいけば、これは理にかなっています。これを立ち上げて実行することが私にとってどれほど重要であるか、あなたにはわかりません。