みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

.htaccessでのカノニカル指定

大量のPDFファイルを所持するサイトを運営しています。
ディレクトリ構成は、

■ルート(http://hogehoge.com/
index.html
hoge1.html
hoge2.html

└■食べ物フォルダ
  ├index.html
  │
  ├■果物ごフォルダ
  │ ├index.html
  │ │
  │ ├■りんごフォルダ
  │ │ ├index.html
  │ │ ├ringo1.pdf
  │ │ ├ringo2.pdf
  │ │ ├ringo3.pdf
  │ │
  │ ├■みかんフォルダ
  │ │ ├index.html
  │ │ ├mikan1.pdf
  │ │ ├mikan2.pdf
  │ │ ├mikan3.pdf
  │ │
  │ ├■ぶどうフォルダ
  │   ├index.html
  │   ├budou1.pdf
  │   ├budou2.pdf
  │   ├budou3.pdf
  │
  ├■野菜フォルダ
  ・
  ・
  ・

ルート→「食べ物」→「果物 / 野菜」→「りんご・みかん・ぶどう / キャベツ・大根・人参」
という具合で、すべてのフォルダ内にはindex.htmlと関連する
複数のpdfファイルを格納している状態です。

それぞれのpdfファイルは内容がほぼ一緒なので
link rel="canonical" を設定したいんです。

ringo1.pdf + ringo2.pdf + ringo3.pdf → りんごフォルダの index.html にカノニカル指定
という具合に全てのフォルダで行いたいのですが自分なりに調べた結果、

<FilesMatch "\.pdf$">
Header set Link "<http://hogehoge.com/食べ物/果物/(りんごorみかんorぶどう)/index.html>; rel=\"canonical\""
</FilesMatch>

と記入した.htaccessファイルを各フォルダに1個1個設置すれば実現できると思うのですが、
数が膨大になってしまうので、もっとスマートな方法があれば・・

と思い質問させて頂きました。


詳しい方、どうか知恵をお貸し下さい。

投稿日時 - 2013-06-28 04:03:15

QNo.8152971

困ってます

質問者が選んだベストアンサー

No2 回答者です。

SetEnvIf Request_URI "^(.*)/([^/]*)\.pdf$" Req_Uri=$1

この正規表現で、 () の出現順に $1, $2 に格納されるので、 $1 には、ディレクトリpath名が入るはず。
apacheサーバーの正規表現はperl準拠とあったからこれでいいと思ったのだけど。
 ブラウザが
http://example.com/ringo/ringo1.pdf
を要求したときに、

Link <http://example.com/ringo/index.html>; rel="canonical"

この文字列がファイルheaderに追加されて、pdfファイルが返ってくるはず。この状態にしたいのですよね?
Google 検索エンジンはこの情報を解析するようになったが、普通のブラウザには用がないので、ファイルヘッダーは普通のブラウザ(operaとかieとか)じゃ表示してくれなくて、うまくいってるのかよく解らないのが悩みどころ。
firefoxならプラグインで表示してくれるのがあったような気もするが。。。そこまで入れてないので確認できてません。

投稿日時 - 2013-06-29 13:24:28

お礼

ご提案頂いたコードをルートディレクトリの.htaccessに追加し、
さらにFirefox + Live HTTP Headers というアドオンをインストールして
PDFファイルに確認アクセスしてみたところ、

すべてのPDFファイルのヘッダーにきちんと

Link <http://example.com/フォルダ名/フォルダ名/index.html>; rel="canonical"

が表示されました!!


PHPの事を全然分かってないのに変なご指摘をしてしまい申し訳ありませんでした。。
私が望んでいた1番スマートな方法で解決できました!!


2度もご親切にして下さって本当に感謝です!!ありがとうございました!!

投稿日時 - 2013-06-29 19:15:49

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

「.htaccessを使ってHTTPヘッダーにrel="canonical"を指定する方法」
http://blog.fkoji.com/2011/06190242.html

上記ページの最終項で、環境変数を使って一括変換する方法が載っている。
試してないけど、これをトップディレクトリーに置くだけでいいのでは?下位ディレクトリーにも同様に適用されるはず。
<FilesMatch "\.pdf$">
SetEnvIf Request_URI "^(.*)/([^/]*)\.pdf$" Req_Uri=$1
Header set Link "<http://example.com%{Req_Uri}e/index.html>; rel=\"canonical\""
</FilesMatch>

投稿日時 - 2013-06-28 21:38:54

お礼

ご回答ありがとうございます。


ご提案下さった方法だと

例えば「ringo」フォルダの中に
「ringo1.png」「ringo2.png」「ringo-aka.png」「ringo-ao.png」
があった場合、それぞれ

http://example.com/ringo1/index.html
http://example.com/ringo2/index.html
http://example.com/ringo-aka/index.html
http://example.com/ringo-ao/index.html

をカノニカル指定する事になりませんか?

4つ全部まとめて
http://example.com/ringo/index.html

を指定するようにしたいのです。


何だかやっぱり実現可能な気がするのでもう少し自分でも調べてみます。

ありがとうございました。

投稿日時 - 2013-06-29 01:47:46

ANo.1

>数が膨大になってしまうので、もっとスマートな方法があれば・・

phpスクリプトで.htaccessを生成するという話ではないんですかね。

スクリプトからの書き込み権限があることが前提です(なのでモジュール版だと厳しいかもしれません)が、再帰的にディレクトリを辿って(というか、index.htmlを探して).htaccessを置いていけばいいと思います。

投稿日時 - 2013-06-28 17:05:30

補足

説明不足でしたね。

上記の私の方法だと、
.htaccessに
Header set Link "<http://hogehoge.com/食べ物/果物/りんご/index.html>
Header set Link "<http://hogehoge.com/食べ物/果物/みかん/index.html>
Header set Link "<http://hogehoge.com/食べ物/野菜/キャベツ/index.html>
Header set Link "<http://hogehoge.com/食べ物/野菜/大根/index.html>
と、各フォルダ毎に1つずつURLを書き換たものをいちいち設置しなければならないので書き換えが面倒。

さらに言うと、各フォルダ毎に.htaccessを設置するのが嫌なので
ルートディレクトリに1つだけ.htaccessを設置して、
そのルートに置いた.htaccessが各フォルダを参照して、フォルダ内にpdfファイルがある場合は
そのフォルダ内のindex.htmlにカノニカル指定を自動でしてくれるのが理想なんです。


PHPに関してはincludeとechoしか使えないレベルの知識しかありませんので、
詳しい方にお聞きすればPHPを使ってもっとラクに管理できる方法があるんじゃないかと思い、
質問させて頂きました。

投稿日時 - 2013-06-28 18:02:06

あなたにオススメの質問