• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:.htaccessでのカノニカル指定)

.htaccessでのカノニカル指定

このQ&Aのポイント
  • 大量のPDFファイルを所持するサイトを運営しています。ディレクトリ構成は、ルート→「食べ物」→「果物 / 野菜」→「りんご・みかん・ぶどう / キャベツ・大根・人参」という具合で、すべてのフォルダ内にはindex.htmlと関連する複数のpdfファイルを格納しています。
  • それぞれのpdfファイルは内容がほぼ一緒なので、link rel="canonical" を設定したいと思っています。各フォルダに.htaccessファイルを設置する方法では数が膨大になってしまうため、もっとスマートな方法を知りたいです。
  • <FilesMatch ".pdf$"> Header set Link "<http://hogehoge.com/食べ物/果物/(りんごorみかんorぶどう)/index.html>; rel=\"canonical\"" </FilesMatch>

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

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ならプラグインで表示してくれるのがあったような気もするが。。。そこまで入れてないので確認できてません。

ganggg
質問者

お礼

ご提案頂いたコードをルートディレクトリの.htaccessに追加し、 さらにFirefox + Live HTTP Headers というアドオンをインストールして PDFファイルに確認アクセスしてみたところ、 すべてのPDFファイルのヘッダーにきちんと Link <http://example.com/フォルダ名/フォルダ名/index.html>; rel="canonical" が表示されました!! PHPの事を全然分かってないのに変なご指摘をしてしまい申し訳ありませんでした。。 私が望んでいた1番スマートな方法で解決できました!! 2度もご親切にして下さって本当に感謝です!!ありがとうございました!!

その他の回答 (2)

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.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>

ganggg
質問者

お礼

ご回答ありがとうございます。 ご提案下さった方法だと 例えば「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 を指定するようにしたいのです。 何だかやっぱり実現可能な気がするのでもう少し自分でも調べてみます。 ありがとうございました。

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.1

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

ganggg
質問者

補足

説明不足でしたね。 上記の私の方法だと、 .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を使ってもっとラクに管理できる方法があるんじゃないかと思い、 質問させて頂きました。