web-dev-qa-db-ja.com

古いクエリ文字列URLからCakePHP Canonical URLに301リダイレクトする方法は?

現在、次のような。htaccessファイルがあります。

RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$
RewriteRule ^index\.php$ /index.php?url=item/%1 [R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

これは、古いクエリ文字列ベースのURLを新しいCakePHP URLに301リダイレクトすることを意図しています。これにより、ユーザーが正しいページに正常に送信されます。ただし、Googleはそれを好まないようです(以下を参照)。以前にこれを試しました:

RewriteCond %{QUERY_STRING} ^action=view&item=([0-9]+)$
RewriteRule ^index\.php$ /item/%1 [R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

しかし、それは失敗します。 2番目の書き換えルールは、書き換えられたURLをキャッチしないようです。直進します。

最初のバージョンを使用しても問題はありませんが、それがGoogleの動作を妨げているのではないかと疑っています。新しいURLでいっぱいのサイトマップのインデックスが作成されていません。私の古いサイトマップは完全に索引付けされており、すべてのURLはGoogleの索引にあります。しかし、古いURLから新しいURLへのリダイレクトに従っていません。古いサイトマップにあったクエリURLごとに「フォローされていない」エラーがあります。

ここで301リダイレクトを適切に使用していますか?それは奇妙な書き換えルールですか? Googleとユーザーの両方を適切なページに送信してページランクを保存するにはどうすればよいですか?

5
Daniel Bingham

mod_rewrite documentation から引用:

「ほとんどの場合、[R]フラグを[L]の先頭に追加するので、[R,L]と組み合わせて[R]を使用する必要があります(つまり、http://thishost[:thisport]を使用します) URIに渡されますが、これをルールセットの次のルールに渡します。これにより、「リクエスト内の無効なURI」警告が発生することがよくあります。

実際、外部リダイレクトに[NS,L,R=code]を使用することをお勧めします サブリクエストを書き直す特別な理由がない限り

追伸 これは「フォローされていない」エラーについてGoogleが言わなければならないことです。 不正なリダイレクトが実際にそれらの原因であるようです。欠落している[L]フラグを追加する以外に、 Firebug のNetパネルを使用して、サーバーがLocationヘッダーで送り返しているものを正確に確認することをお勧めします。

2
Ilmari Karonen

Googleとユーザーの両方を適切なページに送信してPageRankを保存するにはどうすればよいですか?

念のために言うと、Googleとユーザーを別々にリダイレクトしているわけではありませんか?

正規表現はわかりませんが、URLを2回書き換えているようですので、これについて間違えた場合は申し訳ありません。あれは正しいですか?

RewriteRule ^index\.php$ /item/%1 [R=301]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]

それはリダイレクトループとはみなされないでしょうか?

0
SEO