htaccessで特定ディレクトリ以下のみアクセス制限する方法

製作 プログラム

最終更新日:2022/07/12

ラムネグから一言:寝る前に読むとくだらなすぎて逆に寝れると好評なすごい適当なブログをこっちではじめてます.

自分のサイトで、htaccessを使って海外からのアクセスをブロックして国内のみ閲覧可にするとか、やられてる方も多いと思います。

ただ、特定のディレクトリ(特定のパーマリンク、スラッグ、URLを含む場合のみ)のみアクセス制限したい場合もあるはず。というか私がそういう状況になりました。

htaccessはhtaccessファイルを設置したディレクトリ以下に影響が出るんで、ネット検索しても「ディレクトリ毎にアクセス制限したければそのディレクトリ直下にhtaccessを置けばOK」としかかかれていなくて、「いや、ワードプレスとかだとURLごとのディレクトリを持ってないからそれだとできないんだよなー」と。

あとはワードプレスで限定して検索すると「そのフォルダ名を作っちゃって、そこにhtaccessファイルを置けばいい!」みたいなかなりな荒業?が紹介されてたりして…、それはそれでできるのかもだけど、なんかヘンな不具合生みそうで怖い。

いずれも痒い所に手が届いてない気がしたので、今回必死に調べてみました。

てことでここではワードプレスみたいなディレクトリが存在しない場合でも、htaccessで特定のディレクトリ以下のみにアクセス制限を行う方法を紹介しますね。

  1. if文を使う
  2. コピペでOK!サンプル
  3. サクッとコード説明
    1. 1行目でディレクトリ判定
    2. 2~13行目:クローラーはアクセスOK!の記載
    3. 14行目以降:日本国内IP全列挙
  4. まとめ

if文を使う

htaccessはApacheっていうサーバーで使ってるファイルなんですが、このApacheにもバージョンがあります。

6年くらい前に入れたApacheでも2.4だったのでほとんどの場合問題ないかと思いますが、今回紹介する方法はApache2.4以上じゃないと動きません。というのもif文をhtaccess内で使えるのがApache2.4からなんです。

Apacheバージョン確認方法

レンタルサーバー上のApacheバージョン確認方法は、たぶんそのレンタルサーバーの仕様一覧に記載されてると思います。もし載ってなかったら問い合わせれば教えてくれます。

もし自分で確認する場合は、レンタルサーバーにsshとかでコマンドラインで接続した後に「httpd -v」と打てば出てきます。

はい、んでApacheのバージョンが2.4以上だと確認したところでやり方を。

コピペでOK!サンプル

<If "%{REQUEST_URI} =~ /\x2Fyour_url\x2F.*/">
  SetEnvIf User-Agent "Googlebot" allowbot
  SetEnvIf User-Agent "msnbot" allowbot
  SetEnvIf User-Agent "bingbot" allowbot
  SetEnvIf User-Agent "Slurp" allowbot
  
  order deny,allow
  deny from all
  
  allow from env=allowbot
  
  allow from googlebot.com
  allow from google.com
  
  allow from 1.0.16.0/20
  allow from 1.0.64.0/18
  allow from 1.1.64.0/18
  allow from 1.5.0.0/16
.
.
.
(以下略)
</If>

これをコピペして一行目の「your_url」を自分のディレクトリ名(というかURLとかスラッグ名とか)に変更すればそのディレクトリの下のみにアクセス制限をかけられます。ちなみに上の例では海外からのアクセスを遮断して、日本国内のみからのアクセスを有効にしています。

(※注意!:「\x2F」は消さないで!これ全体でスラッシュ記号を表しています)
いや以下略て…

スミマセン。以下略されちゃコピペで使えないですよね。

上の下の方ずーっと並んでるallow行は日本国内で使用されているIPアドレスを全部列挙します。たぶん4,000行くらいあります。

このリストはググればすぐ出てきますが「http://www.cgis.biz/tools/access/」で入手できます。とりあえずこのサイト様からダウンロードできるhtaccessの中身のallow行のみをコピペして以下略の所にドバっと貼り付ければOK。

何やってるかは下で説明してるので興味があるなら読んでみてくださいね。

サクッとコード説明

ただまー人間っていうのはコピペでOKとは言われても何やってるかわからないコードを使うのは気持ち悪いものだと思います。てことでサクッとコード説明を。

1行目でディレクトリ判定

1行目の所でURLにどんな文字列があったらアクセス制限するの?っていうのを指定しています。if文ですね。

ここで指定した文字列をURLに含む場合のみその下のずらずらーと4,000行近く並ぶ処理が有効になります。…いや正直日本国内のみのアクセス制限するだけで4,000行て…。と思っちゃいますよね。

ただ現状これ以外に方法がない、というのが事実。国別コードで判定、っていうのもできるんですが、めちゃめちゃザルらしく、ぜんぜんアクセス制限できないみたい。てことでIPアドレス列挙するしかない、と。海外アクセス制限を設けているサイトはどこもこのやり方をしているんですよね(ちなみにhtaccessじゃなくて別途データベースに4,000件以上の国内IPアドレスを記録しておいて、phpベースでアクセス制限する方法もあります。結局4,000件の国内IPアドレス一覧をどっかで持つ必要があるのは変わらず…です)。

なんかウェブの世界って思ったよりずっと泥臭いですよね。

4,000件って逆に少なくない?

日本国内で使用されているIPアドレスが4,000件暗いって逆に少なすぎる…と思われる勘のいい人もいるかもしれません。

確かに日本国民だけで1億人くらいいるはずだし、とても4,000個のIPアドレスじゃ足りないですよね。4,000てそこらの私立大学の生徒数より少ないというか。

これは列挙上はIPアドレスは4,000個ですが、サブネットマスクっていう、わたしもうろ覚えの仕組みが入ってきてて、例えば上記allow行のIPアドレス1行で200個とかのIPを表せてるんです。てことで日本国内に割り当てられたIPアドレスの総数って話になると約2億個あったはずです。その2億個をあの4,000行でギュッと列挙してるってこと。

2~13行目:クローラーはアクセスOK!の記載

2行目から13行目はそれこそ「htaccess 国内のみ アクセス制限」とかで検索してもらうのが一番ですし、私自身もそうやって出てきたサイトから完全にコピペしてるだけです。

一行目からまとめると、まず1行目でこのディレクトリ以下ならアクセス制限するよ!って宣言してて、次のsetenvifでは「あれ?でもクローラーさんなのかな?」という判定をしています。んで続く「order deny,allow」と「deny from all」でとりあえず全員アクセス拒否します!って書いています。

んで続く「allow」行で、クローラーさんなら見てくれていいよ!それからグーグルも!と書いてる感じ。

14行目以降:日本国内IP全列挙

4,000行近いallow行が並ぶんですが、ここでは日本国内で使われているIPアドレスを全部列挙しています。

さっきはぜんぶ来ちゃダメ!しといて、んでクローラーやグーグルならOK!しましたよね。その続きで、日本のIPアドレス一つ一つを「よし、君は日本のお客だね!なら通ってよし!」としてるわけです。

非常に泥臭いんですが、これ以外に方法がないんでこれで。

htaccessが4,000行ってパフォーマス大丈夫?

たぶん気になるのがhtaccessに4,000行も書いてサイトの表示速度とかパフォーマンス大丈夫なの?という所だと思います。

個人的にこの方法で特定のディレクトリ以下のアクセス制限をかけていますが、めちゃめちゃ遅い、という感じはありません。確かにこのアクセス制限をするまえよりはほんのちょびっと遅くなったかな?という感じですが、ほぼ誤差です。

さすがにウェブサイト全ページで、日本国内のみ閲覧可能にしようとしたら全ページでちょびっとずつ遅くなるんでよろしくないかもですが、今回の場合は特定のディレクトリ以下のみしかパフォーマンスに影響しないのでそこまで気にしなくてもいいと思います。

まとめ

今回はhtaccessで特定ディレクトリ以下のみアクセス制限を設ける方法を紹介しました。

まとめるとif文を使えばワードプレスのような内部にディレクトリ構造を持ってないサイトであっても、特定のディレクトリ以下でのアクセス制限ができる、という感じ。

注意点としてはApache2.4以上じゃないとifが使えないという事のみ。参考にしてみてくださいね。

【おしらせ、というか完全なる宣伝】

文体がもうぜんぜん適当すぎてあれだけどものすごい自由に書いてるブログ「檸檬だくだく」もよろしく.寝る前に読める恐ろしくくだらないやつです.

こんなにも一ミリも目を引かれないタイトルを取り扱ってます: ララピー / 我が愛しのラムネ / 昼間っから /