Love澤's Room

技術系ネタをまとめていたブログ。現在はカテゴリにこだわらず更新中。

Webサービスで、ある素材を利用しつつ、素材へのアクセス制限をかける方法(htaccessを利用)

新サイトへ移転しました
約3秒後に自動的にリダイレクトします。


htaccessを用いることで、ファイルにアクセス制限をかけることが出来ます。

今回目標とするのは
「あるサービス内で色々な素材を使うが、その素材自体にはアクセス出来ないようにする」
です。ベーシック認証などの話ではないのでご注意下さい。うだうだ書いていますので結局どうしたら良いのかさっさと知りたい、という方は、記事の最後の方に飛んで下さい。

素材自体にアクセス出来ないようにする方法

素材とそのディレクトリにアクセス制限をかける方法として

  1. そもそも、素材置き場をpublic_html以下ではないどこか別のディレクトリに置く
  2. .htaccessを利用してアクセス制限をかける

といったことが考えられました。

もちろん前者が確実なのでしょうが、もろもろの都合により、どうしてもpublic_html以下に素材を置かなければいけないこともあるかと思います。そういった場合もあるかと思ったので、今回は前者「.htaccessを利用してアクセス制限をかける」ということを試みました。

なお、今回はファイル構成が以下のようになっているとして話を進めます。

  • public_html
    • material_search.php
    • materialディレクトリ
      • creator1ディレクトリ
        • image1.png
        • image2.gif
      • creator2ディレクトリ
        • image3.pdf
        • image4.jpg

materialディレクトリ以下へのアクセスを全て拒否する場合

単に、素材置場(materialディレクトリ)以下の全てのファイル・ディレクトリへのアクセスを拒否したい場合は非常に簡単です。materialディレクトリに.htaccessファイルを作成し、以下のように記述します。

deny from all

しかしこの場合、サービス内で素材を利用したい場合にも利用できなくなります。つまり、material_search.phpでの検索結果、素材を表示する際にも、アクセスできなくなってしまう、ということです。(自分の設定の問題かもしれませんが。)

今回の目標としては、サービス内では素材を利用できるようにしたいので、このままではだめです。

サービス内で素材を利用しつつ、素材へのアクセス制限をかける

そこで、.htaccessファイルを以下のように書き換えます。

SetEnvIf Referer "^http://hogehoge.com" ShowOK
order deny,allow
deny from all
allow from env=ShowOK

1行目の意味ですが、参考サイトによると

「SetEnvIf」とは、「ある条件が成立した場合に環境変数を設定する」という意味です。
上記の場合は、

  • Referer(参照元)に
  • http://hogehoge.com」という文字列が含まれていた場合に
  • 環境変数に「ShowOK」を設定する

という意味になります。

ということだそうです(『「~」という文字列が』の部分のURLだけ書き換えています)。

以上のようにすることで、例えば、外部サイトからリンクをたどってきたの場合は「http://hogehoge.com」の部分の値が変わるので、ShowOKとならず、また、素材へのURLを直接入力する場合は、Refererの値がないので、ShowOKとなりません。

また、参考サイトで、URLを記述する際の注意点が挙げられています。

  • URLを記述する際には、「 . 」(ドット)は「 \. 」のように円記号(=バックスラッシュ)を前に加えて下さい。 これは、正規表現という記述方法を使っているための仕様です。(※半角文字で記述)
  • また、URLは必ず「http://」から書き、先頭には半角で「 ^ 」(ハット)記号を加えて下さい。 これらを省略しても動作はしますが、省略すると、リンク元ページに少し工夫をするだけでアクセス制限を突破されてしまいます。
  • URLの先頭に「www」がある場合、「www」を省略しても同じページにアクセスできる場合があります。 (例えば、http://www.example.com/ でも http://example.com/ でもアクセスできるなど。) その場合は、両方のURLを記述しておきましょう。

※許可したいURLが複数ある場合は、この行を複数回列挙します。

というわけで、長々となりましたが、以上のようにすることで、冒頭に上げた目標を達成することが出来ます。

(参考サイト)
直リンクを防ぐには?…禁止と言っても無駄 [ホームページ作成] All About