何とも表現が難しいですが、実際にご自身のWordPressサイトを確認してみると、「え?こんな風になってたの?」と確認でき、対策の必要性が分かってもらえるのではないかと思います。
試してみていただきたいのは画像ではなく、zip形式で圧縮したファイル。何でもいいので1つ作成してメディアへアップロードしてください。
アップロードしたら、メディア一覧からファイル名のリンクか、「編集」リンクをクリックしてください。
出てきた編集画面上の「パーマリンク」横のリンクを開いてみてください。添付ファイルのリンクだけがあるページが表示され、リンクをクリックすると・・・ダウンロードできてしまいますね。
また、編集画面右の「ファイルのURL」をコピーして開くと・・・こちらもダウンロードが簡単にできてしまいます。
まあ、zip形式のファイルをアップロードするという場合、多くは何かのプラグインを使ってダウンロード提供しているサイトかと推察するのですが、正確なURLが分からなければ起こりえないにしても、スルーしてダウンロードできてしまうのは問題だと思います。ましてや、有料のコンテンツだったりしたら・・・大問題ですよね?
今回はWordPressのこの仕組みを調整して、以下のようにしていく方法を紹介します。
- 特定のファイルへ直接アクセスされたら、特定のページへ移動させる
- 1の設定がないファイルへ直接アクセスされたらサイトのトップページへ移動させる
なお、今回のカスタマイズはテーマの「functions.php」へコードを追加しますので、以下のスキルのない方は避けた方がよいでしょう。
- テーマのfunctions.phpへ何かの追加を行ったことがある方
- 多少でもPHPコードについて知識のある方
- エラーが出た際に対処できる方
ファイルを直接アクセス(ダウンロード)できないようにする方法
機能自体は結構簡単なコードで実装できます。以下のコードが完成例です。
/* 画像ページ・添付ファイルページをトップページへ移動 */
function redirect_to_home_page() {
//特定のページを特定のURLへ移動(301)
if (is_single('投稿や固定ページのID') ) {
wp_redirect( '移動先のURL', 301 );
exit;
}
//設定していない画像や添付ファイルをトップページへ移動(302)
if (is_attachment() ) {
wp_redirect( home_url(), 302 );
exit;
}
}
add_action( 'template_redirect', 'redirect_to_home_page' );
コード解説
まずお約束のユーザー定義関数と、これをしなさい!っていうアクションフックを作ります
function redirect_to_home_page() {
命令の内容
}
add_action( 'template_redirect', 'redirect_to_home_page' );
これで「命令の内容」と書かれた部分の命令を、「template_redirect」というページを作成する前に実行しなさいという意味のフック(処理)がかかるという仕組みができます。
命令の内容自体は2段構えになっていて、後半の
//設定していない画像や添付ファイルをトップページへ移動(302)
if (is_attachment() ) {
wp_redirect( home_url(), 302 );
exit;
}
で「is_attachment」(≒メディアにアップロードしたものかどうか)を判断した上で、もしもそうなら「wp_redirect」で「home_url()」(トップページ)へ「302」(一時的リダイレクト)をしなさいという指示をしています。
前半のコードは、「is_single」(個別の投稿や固定ページ)を「wp_redirect」で「移動先のURL」へ「301」(完全にリダイレクト)をしなさいと指示しています。
//特定のページを特定のURLへ移動(301)
if (is_single('投稿や固定ページのID') ) {
wp_redirect( '移動先のURL', 301 );
exit;
}
複数の画像やファイルのページをそれぞれ特定のページへリダイレクトさせたい場合は、上のまとまりをどんどん追加していけばOKです。
命令に書かれる内容は順番に処理されますから、まどろっこしく「elseif」や「else」などで決めてあげる必要はありません。
これで、前半のコードに合致する投稿IDのものは特定のURLへリダイレクトされ、そうでない残りの画像やファイルへの直接アクセスはトップページへリダイレクトしなさいという、漏れのない形になります。
特定のページのリダイレクトを設定する際には、「投稿や固定ページのID(今回の場合は、画像やファイルのページ)」を調べる必要があります。
IDを簡単に知るには、一時的にShow IDsのようなプラグインを入れ、終わったら外せばいいと思います(Show IDsプラグインはインストールして有効化するだけで、以下のようにメディアの一覧へIDが表示されるようになり、便利です)。
そもそも何で直接ダウンロードできるようになっているのか?
そもそも何でこんな風に直接アクセスできるようになってるのか?について少し触れておきます(あくまでも私の想像です)。
WordPressでは、投稿や固定ページ、タグ、カテゴリーなどすべてを一意の(重複のない)IDを付けて判別しています。逆にこのIDがあるおかげて簡単にデータの抽出ができるようになっています。
そしてアップロードした画像やファイルも多分に漏れず、同じようにアップロードした段階でIDが振られます。ただし、これは画像やファイルそのものではなく、画像やファイルを表示する投稿などと同じ1つのページとして作成されます。
この生成されたページに対して今回のような措置を何もしないと、通常の投稿と同じように普通にアクセスできてしまうのです。
「こんな管理する側すら知らないページにどうやってアクセスするの?」と疑問に思うかもしれませんが、WordPressではこのページも投稿と同じ1つのページとして扱うため、誰でもアクセスできる状態で保存します。それをたまたま、検索エンジンなどが見つけて登録し、検索結果に表示されると・・・公開されているわけですから何の気なしにアクセスできてしまうのです。
これを知らずに大事な圧縮ファイルなどを安易にアップロードしたりした場合、ひょっとするとそれらが検索結果に表示され、知らない間にダウンロードされているかも・・・という事態が発生しますから、注意が必要です。
また、ページのURL自体は定型化されていますから、悪意を持った人が適当にアクセスして「みーつけた!」とダウンロードしていく懸念もありますから、今回のような方法で必ず対策するようにしましょう。
ちなみに、今回の方法では、通常の投稿などに表示する画像をダウンロードできないようにすることはできません。なぜかというと、それは「画像」であって「画像のあるページ」ではないからです。そちらの対策はまた別に行う必要があります
画像やファイルのページを検索エンジンに登録されないようにする方法
ついでに、画像やファイルアップロード時に生成されるページを検索エンジンに登録(検索の対象)にならないようにする方法を紹介しておきます。
「登録されない」と書いていますが、「noindex」というメタデータを追加して、「お願いだから登録しないでね!」というお願いベースのものなので、確実に登録されないとは限りません
こちらも今回のカスタマイズと同様に、テーマのfunctions.phpへ以下の簡単なコードを追加するだけです。
/* メディアページをインデックスしない */
function hab_add_noindex_attachment(){
if (is_attachment()) {
echo '<meta name="robots" content="noindex,follow" />';
}
}
add_action('wp_head', 'hab_add_noindex_attachment');
コード自体もよく似ていて、今回は、「is_attachment」で画像やファイルのページだったら、HTMLのヘッダーへ「noindex」「nofollow」メタタグを出力してねというものです。
ついでなのでやっておくことをおすすめします。