私の質問で参照しているWebサイトは http://www.bgmenus.com です。
リスティング用に次のようなクリーンなURLを作成しました。 http://bgmenus.com/five-guys/341
私はこれを使用してそれらを書き直しました:RewriteRule /([^/.]+)/?$ /restaurants.php?id=$1 [L,NC,QSA]
問題は、古いURLがまだ存在し、機能することです: http://bgmenus.com/restaurants.php?id=341
私の質問は、URLの/restaurants.php?id=123
バージョンをクリーンバージョンに戻す301ので、重複がないようにする方法です。
ご協力いただきありがとうございます。
リクエストURLが正しい場合は、phpスクリプトrestaurant.phpで$ _SERVER ['REQUEST_URI']を確認できます。例えば:
if ($_SERVER['REQUEST_URI'] !== '/' . $name . '/' . $id)
{
header ('HTTP/1.1 301 Moved Permanently');
header ('Location: http://www.bgmenus.com/' . $name . '/' . $id);
die();
}
$ nameはレストラン名[5人]、$ idはレストランID [341]です。
ヒットが http://bgmenus.com/five-guys/341 からのものである場合ifステートメントはfalseになります誰かが/restaurants.php?id=123を直接ヒットすると、ifはtrueユーザーは新しいseoフレンドリーなURLにリダイレクトされます
IDしか持っていないため、URLからレストラン名を取得できません。 IDに基づいて、既存のルールの上にこのルールを使用できます。
RewriteCond %{THE_REQUEST} \s/+restaurants\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /restaurant/%1? [R=302,L]
これにより、/restaurants.php?id=123
が/restaurant/123
にリダイレクトされます
これに変更します(「NC」は削除できます)
RewriteRule /([^/.]+)/?$ /restaurants.php?id=$1 [R=301,L,NC,QSA]
.htaccessにはrestaurants.php?id=123
を/five-guys/341
にマッピングする方法がありません。データベースから5人スラッグをプルすることはできません。これをコーディングする必要があります。大まかな概要は次のとおりです。
// $row variable comes from database
// it might look like
// array("id" => 123, "slug" => "five-guys", "name" => "Five Guys");
$requestedURL = $_SERVER['REQUEST_URI'];
$preferredURL = '/' . $row['slug'] . '/' . $row['id'];
if ($requestedURL !== $preferredURL) {
header ($_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently');
header ('Location: http://' . $_SERVER['HTTP_Host'] . $preferredURL);
die();
}
サーバーによっては、元のURLが別のサーバー変数に記録される場合があります。わからない場合は、var_dump($_SERVER)
を使用して、before-rewritingURLを含む変数を見つけます。