現在、次のような。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とユーザーの両方を適切なページに送信してページランクを保存するにはどうすればよいですか?
mod_rewrite documentation から引用:
「ほとんどの場合、
[R]
フラグを[L]
の先頭に追加するので、[R,L]
と組み合わせて[R]
を使用する必要があります(つまり、http://thishost[:thisport]
を使用します) URIに渡されますが、これをルールセットの次のルールに渡します。これにより、「リクエスト内の無効なURI」警告が発生することがよくあります。
実際、外部リダイレクトに[NS,L,R=code]
を使用することをお勧めします サブリクエストを書き直す特別な理由がない限り 。
追伸 これは「フォローされていない」エラーについてGoogleが言わなければならないことです。 不正なリダイレクトが実際にそれらの原因であるようです。欠落している[L]
フラグを追加する以外に、 Firebug のNetパネルを使用して、サーバーがLocation
ヘッダーで送り返しているものを正確に確認することをお勧めします。
Googleとユーザーの両方を適切なページに送信してPageRankを保存するにはどうすればよいですか?
念のために言うと、Googleとユーザーを別々にリダイレクトしているわけではありませんか?
正規表現はわかりませんが、URLを2回書き換えているようですので、これについて間違えた場合は申し訳ありません。あれは正しいですか?
RewriteRule ^index\.php$ /item/%1 [R=301]
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
それはリダイレクトループとはみなされないでしょうか?