web-dev-qa-db-ja.com

ハッシュ部分(アンカー)で301をリダイレクト#

私たちのウェブサイトの1つに次のようなURLがあります:example.oursite.com。このwww.oursite.com/exampleのようなURLでサイトを移動することにしました。これを行うために、コード301で新しいURLにリダイレクトする書き換えルールをApacheサーバーに記述しました。

多くのウェブサイトは、example.oursite.com/#id=23の形式のURLで私たちにリンクしています。問題は、リダイレクトによってURLのハッシュ部分がIEで消去されることです。私の知る限り、ハッシュ部分がサーバーに送信されることはありません。

ハッシュ部分を保持するためにjavascriptでリダイレクトを実装したかったのですが、検索エンジンはURLが変更されたことを認識しません。 (コード301は返されません)

ページランクを新しいURLに転送する必要があるため、検索エンジンに新しいURL(301)を通知する必要があります。

301コードでリダイレクトし、のハッシュ部分(#id=23)をURLに保持する方法はありますか?

21
Mike

検索エンジンは実際にはハッシュタグを気にし、ページ上の特定のコンテンツを強調するために頻繁に使用します。

ただし、質問に対して、アンカーの場所は残念ながらHTTPリクエストの一部としてサーバーに送信されません。ユーザーをリダイレクトする場合は、クライアント側のJavascriptでこれを行う必要があります。

良い記事: http://web.archive.org/web/20090508005814/http://www.mikeduncan.com/named-anchors-are-not-sent/

14
Eric Martindale

サーバーが#(301リダイレクトを除外)を認識せず、Googleが AJAXクロールスキーム を非推奨にしていることを考えると、フロントエンドソリューションが唯一の方法のようです!

私がそれをした方法:

 (function() {

    var redirects = [
        ['#!/about',         '/about'],
        ['#!/contact',       '/contact'],
        ['#!/page-x',        '/pageX']
    ]

    for (var i=0; i<redirects.length; i++) {
        if (window.location.hash == redirects[i][0]) {
           window.location.replace(redirects[i][1]);
        }
    }

 })();

Googleクローラーが実際にJavascriptを実行するため、新しいページは適切に索引付けされると思います。

<script>タグのすぐ下の<title>タグに入れて、他のJS/CSSの前に実行されるようにしました。このスクリプトは、インデックスファイルにのみ必要であることに注意してください。

3
AlexKempton

Googleには、AJAXアプリケーションのハッシュURLに基​​づく特別な構文があります: http://code.google.com/web/ajaxcrawling/docs/getting-started.html

2
kkaefer

URLのハッシュ/ページアンカー/ブックマーク部分は検索エンジンによってインデックス付けされていないため、ページのランク付けには影響しないと確信しています。 「inurl:#」をグーグル検索すると、ドキュメントがゼロになるので、私の仮定が裏付けられます。外部サイトからのリンクは、ハッシュなしでインデックス付けされます。

ハッシュ部分がサーバーに送信されないという点で正しいです。私が知る限り、ハッシュを含むリダイレクトURLを作成できる良い方法はありません。

このため、リダイレクト中にハッシュを正しく管理するかどうかはブラウザ次第です。 Firefox3.5はこれを正常に実行しているようです。既知のリダイレクトがあるURLにハッシュを追加すると、アドレスバーに新しい場所へのURLの変更が表示されますが、ハッシュはそのまま保持されます。

編集:以下のコメントへの応答で、必要な部分の外部URLにハッシュ記号ではないがある場合、URLを完全に書き換えることが可能です。 。 Apacheの書き換えルールがそれを処理します。

RewriteCond %{HTTP_Host}   !^exemple\.oursite\.com [NC]
RewriteCond %{HTTP_Host}   !^$
RewriteRule ^/(.*)         http://www.oursite.com/exemple/$1 [L,R]

Apacheを使用していない場合は、サーバーのドキュメントで同様の情報を探す必要があります。

2
zombat

古いアドレスに、すべてのリクエストをキャッチし、正しいアドレスとコードで新しいサイトにリダイレクトするページを作成できます。

私はそのようなことをしましたが、それはasp.netにあり、あなたが使用している言語ではないと思います。とにかく、これを任意の言語で行う方法があるはずです。

1
rslite

ステータス301を返す場合、サーバーは新しい場所を指す「Location:」ヘッダーを返すことになっています。実際には、これが実装される方法は異なります。完全なURL(netlocとパス)を提供するサーバーもあれば、新しいパスを提供し、ブラウザーが元のnetlocでそのパスを探すことを期待するサーバーもあります。書き換えルールがパスを削除しているようです。

返されたLocationヘッダーが何であるかを確認する簡単な方法は、python Shell:

>>> import httplib
>>> conn = httplib.HTTPConnection('exemple.oursite.com')
>>> conn.request('HEAD', '/')
>>> res = conn.getresponse()
>>> print res.getheader('location')

Mod_rewriteについて、書き換えルールを正しく実行する方法を説明するのに十分な知識がないのではないかと思いますが、これにより、サーバーが実際にクライアントに実行するように指示していることがわかります。

アカウントを登録したので、編集できません。

zombat:コメントを間違えてすみません。私たちのビデオへのリンクはexemple.oursite.com/#video_id=233です。この場合、Apacheの書き換えルールが機能しません。

Nick Berardi:リンクの動作方法を変更しました。 #はもう使用せず、下位互換性のためにのみ

0
Mike

検索ボットはハッシュタグを気にしません。そして、それらをある種のフラッシュまたはAJAX呼び出しに使用している場合、301リダイレクトが機能しないよりも深刻な問題があります。別の形式のコンテンツがない限り、検索エンジンがあなたのサイトを索引付けしておらず、SEOに関しては間違いなく苦しんでいます。

0
Nick Berardi