web-dev-qa-db-ja.com

.htaccessとPHPを使用して301リダイレクトを実行する方法

私の質問で参照している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ので、重複がないようにする方法です。

ご協力いただきありがとうございます。

1
Trey Copeland

リクエスト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にリダイレクトされます

4
krokola

IDしか持っていないため、URLからレストラン名を取得できません。 IDに基づいて、既存のルールの上にこのルールを使用できます。

RewriteCond %{THE_REQUEST} \s/+restaurants\.php\?id=([^\s&]+) [NC]
RewriteRule ^ /restaurant/%1? [R=302,L]

これにより、/restaurants.php?id=123/restaurant/123にリダイレクトされます

0
anubhava

これに変更します(「NC」は削除できます)

RewriteRule /([^/.]+)/?$ /restaurants.php?id=$1 [R=301,L,NC,QSA]
0
Xane

.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を含む変数を見つけます。

0
Salman A