web-dev-qa-db-ja.com

ダウンロードスクリプトおよび直接リンクを介したPDFファイルの提供:重複したコンテンツ?

PDFドキュメント(数学ペーパー)をホストするWebサイトがあります。 Webサイトのメインページには、ドキュメントへのリンクがあります。

http://example.com/download.php?file=Document.pdf  

download.phpスクリプトの目的は、ドキュメントをダウンロードするIPアドレスを記録することです。

これで、リンクをたどってドキュメントを表示/ダウンロードすることもできます

http://example.com/Document.pdf

このセットアップには、SEOの観点から不利な点がありますか(コンテンツの重複)?そして、はいの場合、どうすればそれを改善できますか?

4
Leo

はい、これは重複コンテンツです。 2つの異なるURLから同じコンテンツにアクセスでき、正規化はありません。

基本的に、これは検索エンジンがSERPに戻るためにどちらかを選択することを意味します。ランキングは基本的に2つのURLに分割されます。

両方のURLがリンクに使用されます。

どちらが正規/優先URLであるかを決定し、その1つのURLのみにリンクする必要があります。

簡単にするために、リストした2つのURLのみを検討します。優先URLは、ダウンロードスクリプト(つまりdownload.php)を経由するURLのように見えますが、そうでない場合は、ファイルをダウンロードするユーザーのIPを追跡しません。

すでにインデックスされているURLを解決するには、直接リンクをスクリプトに外部的にリダイレクトできます。 Apacheを想定すると、ルート.htaccessファイルで次のようなことができます。

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^([^/]+\.pdf)$ /download.php?file=$1 [R=302,L]

これにより、/Document.pdf(ファイルシステム上に物理ファイルとして存在する場合のみ)の要求が/download.php?file=Document.pdfにリダイレクトされます。

$1は、RewriteRuleパターン(つまり([^/]+\.pdf))で最初にキャプチャされたグループへの後方参照です。

302(一時的)リダイレクトを301(永続的)に変更します(正常に機能していることが確認できたら)。 301はブラウザによってキャッシュされるため、テストに問題が生じる可能性があります。


より「ユーザーフレンドリー」なURL(更新)

さらに一歩進んで、/download/Document.pdfのような「ユーザーフレンドリーな」URLを作成できます。これは、正規のURL(リンク先のURL)になります。

この場合、ベース名も「ダウンロード」(つまり、download.php vs /download)のファイルがあるため、MultiViewsが無効になっていることを確認する必要があります。そうしないと、mod_negotiationは、URLを書き換える前にdownload.php(リクエストに応じて)の内部サブリクエストを行う可能性があります。したがって、.htaccessの先頭に:

Options -MultiViews

/Document.pdfまたは/download.php?file=Document.pdfへの直接リクエストは、正規URLに外部リダイレクトにする必要があります。例えば:

RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^([^/]+\.pdf)$ /download/$1 [R=301,L]

RewriteCond %{THE_REQUEST} GET\ /download\.php\ HTTP
RewriteCond %{QUERY_STRING} ^file=(.+\.pdf)$
RewriteRule ^download\.php$ /download/%1 [R=301,L]

%1(上記の$1とは対照的に)は、最後に一致したRewriteCondへの後方参照です。CondPattern(つまり、(.+\.pdf))。

リダイレクトループを防ぐには、THE_REQUESTをチェックする追加のRewriteCond(条件)が必要です。 (THE_REQUESTには元の要求ヘッダーが含まれ、URLが書き換えられても変更されません。)

/download/Document.pdfは、内部的に書き換えられたが「実際の」URLになります。すなわち。 /download.php?file=Document.pdf。それが示唆するように、内部書き換えはサーバーの内部です。外部HTTPリクエストはありません。アドレスバーのURLは変更されません。エンドユーザーからは完全に隠されています。

RewriteRule ^download/([^/]+\.pdf)$ download.php?file=$1 [L]

このディレクティブには、外部リダイレクトをトリガーするRredirect)フラグがないことに注意してください。

理想的には、正規表現をできるだけ制限するようにします。たとえば、上記の正規表現では、.+any文字(1以上)に一致します。ただし、ファイル名が大文字と小文字のみで構成されている場合は、文字のみに一致するように正規表現を変更することをお勧めします。例えば。 [a-zA-Z]+

5
MrWhite