読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Apache Webサーバで,「特定のドメイン名をURLに使ったアクセス」を拒否するアクセス制御の記述方法。RewriteCond HTTP_HOSTすればよい。間違ったDNS設定によるHTTPヘッダをはじく

サーバ web

ApacheでWebサーバを実行しているとき,
URLの「アクセスのされ方」を制御したい。

具体的に言うと,特定のドメイン「として」アクセスされた場合のみ,正常にページを表示したい。

もしも自分が意図しないドメイン名でアクセスされてしまったら,そのアクセスは拒否する。


↑このようなアクセス制御を実現するためには,
Apacheの設定ファイル(.htaccess/httpd.conf)に下記のように書けばよい。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^honmono.com$
RewriteRule ^(.*)$ - [L,R=400]

↑ honmono.com としてアクセスされる場合のみを許可し,
それ以外はエラーページにリダイレクトしている。


ここで出てくる %{HTTP_HOST} とは,
クライアントが送ってきたHTTPヘッダの中で,
サーバのドメイン名を表す文字列。


逆に,特定のドメイン名でアクセスされた場合のみ
エラーページに飛ばしたい,というときは「!」を外せばよい。

RewriteEngine On
RewriteCond %{HTTP_HOST} ^localhost$
RewriteRule ^(.*)$ - [L,R=400]

こうすれば,勝手なドメイン名でアクセスされなくて済む。


ドメイン名の部分は,IPアドレスにすることもできる。

つまり,IPアドレスを使ったURL形式によるアクセスは拒否したい,ということ。

RewriteEngine On
RewriteCond %{HTTP_HOST} !^127.0.0.1$
RewriteRule ^(.*)$ - [L,R=400]

↑こんなふうにすれば,サーバが走っているマシン上で
「127.0.0.1」を使ったURLでアクセスすることはできなくなる。
(localhostという名前を使ったアクセスは許可されている。)

参考リンク

http_host変数に応じてアクセスを拒否するには:

How can I make Apache return error on wrong http_host? - Server Fault
http://serverfault.com/questions/5939...

  • example.comとwww.example.com以外でのドメイン指定のアクセスを拒否する

RewriteEngine On
RewriteCond %{HTTP_HOST} !^(www\.)?example\.com$ [NC]
RewriteRule ^(.*)$ - [L,R=400]


.htaccessの書き方 | murashun.jp
http://murashun.jp/blog/20141229-01.h...

  • HTTP_HOST変数の中身は,リクエスト先のホスト名(DNS名)情報が含まれます。

ちなみにここで紹介したような
「Apache側で,HTTPヘッダ内のドメイン名の部分を見てアクセス制御」
という操作は,
サブドメインの統一・正規化のときによく現れる。

wwwをつけるか・つけないかを統一したい時,
どちらか一方のアクセスだけに統一するということ。

Apacheのmod_rewriteモジュールの使い方を徹底的に解説 | OXY NOTES
http://oxynotes.com/?p=7392#22

  • www.example.comをexample.comへ301リダイレクト

RewriteEngine on
RewriteCond %{HTTP_HOST} www\.example\.com
RewriteRule ^(.*)$ http://example.com/$1 [R=301,L]


.htaccessによるURLの書き換え Rewrite(リライト) - 星屋工作室ブログ
http://hoshiya.biz/blog/2012/02/htacc...

  • ドメインの統一。
  • サーバーは1つのドメイン、例えば "example.com" に対して、"www.example.com" でもリクエストを受け付けます。
  • host がサブドメインを使用している場合は、更に "example.host.com" と "www.example.host.com" でも閲覧可能になり、合計4つのサイトにアクセスが分散することになります。
    • これは、 SEO 対策上あまり好ましいことではありません。 
  • そのため,"Rewrite" を使って、"www.example.com" に統一する


.htaccess - Apache mod_rewrite: force www only if not in localhost - Stack Overflow
http://stackoverflow.com/questions/10...
RewriteCond %{HTTP_HOST} !=localhost
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]


apache :: wwwなしURLを、wwwありURLにリダイレクトさせる(URL正規化) [Tipsというかメモ]
http://tm.root-n.com/server:apache:ht...

  • wwwなしURLを、wwwありURLにリダイレクトさせる .htaccess

RewriteEngine on
RewriteCond %{HTTP_HOST} ^example\.com
RewriteRule ^(.*)$ http://www.example.com/$1 [R=301,L]


もしドメイン名ではなく,
ドメインの後の部分のURL文字列(=クエリ文字列)でアクセス制御したいのであれば,
RewriteCond %{QUERY_STRING} すればよい。

ApacheでURLのクエリ文字列によりアクセス制限 | Livingdeadの日記 | スラド
http://srad.jp/~Livingdead/journal/52...

  • あるPHPスクリプトがあるURLで呼び出されたとき、パラメータ部分というかクエリ文字列によってアクセス制限
  • 具体的にはindex.phpがaction=editで呼び出されたときには特定のIPアドレス以外からのアクセスを弾きたい。


別の手として,ServerNameディレクティブで「自己参照URL」を設定するという方法もある。

しかしフォルダ構成によってはうまくいかないことも。

このディレクティブはドメイン拒否という用途ではなく,
HTTPSのポート設定という用途でよく使う。

WebサーバーへIPアドレスでアクセスできないようにするには - 逆引き集 - Fedoraで自宅サーバー構築
http://fedorasrv.com/memo/log/29.shtml


mod_rewriteの考え方。 - こせきの技術日記
http://koseki.hatenablog.com/entry/20...

  • ドメイン名の正規化。
  • www.example.jp と example.jp と www.example.com を example.com にリダイレクトしたい
  • ServernameとServerAliasで実現


Apacheが名乗るサーバ名について。 - web tips
http://www.nm334.jp/web_tips/webserve...

  • ServerName ディレクティブは、 サーバが自分自身を示すリクエストスキームとホスト名とポートを設定します。
  • これは、リダイレクトする URL を生成する際に利用されます。
    • 例えば、ウェブサーバを動かしているマシンは simple.example.com で、DNS のエイリアス www.example.com もあるときに、 ウェブサーバが後者として認識されて欲しいとき
    • ServerName www.example.com:80
  • ServerName が指定されていないときは、 サーバは IP アドレスから逆引きを行なうことでホスト名を知ろうとします。


SSLアクセラレータ配下のapacheで、アクセスがhttpかhttpsかを判別する方法 - うまいぼうblog
http://d.hatena.ne.jp/hogem/20081116/...

  • NameVirtualHostでポート番号を変えて、http用とhttps用の2つの設定を作ります。
    • 自己参照URLとServerNameの設定
  • apacheのServerNameのドキュメントにはこうある:
    • リバースプロキシやロードバランサやSSL負荷軽減装置のような、 SSLを処理するマシンの後ろでサーバを動かす場合は、 サーバが正しい自己参照 URLを確実に生成するように、 https:// スキームとクライアントが接続するポート番号を、 ServerName ディレクティブに指定してください。


UseCanonicalNameにご注意 - think-t の晴耕雨読
http://think-t.hatenablog.com/entry/2...

  • 「UseCanonicalName」がOnの場合、 httpd.conf に設定した「ServerName」「Port」を使ってURLを自己参照URLを生成します。


【apache】UseCanonicalNameって何? at softelメモ
https://www.softel.co.jp/blogs/tech/a...

  • 多くの状況で Apache は自己参照 URL、すなわち 同じサーバを指す URL、を作成する必要があります。
  • UseCanonicalName On の場合は、ServerName ディレクティブで指定されている ホスト名とポート番号を使って、その正規名 (自己参照の名前) を生成します。

DNS設定をめぐるトラブル

どうしてこんな事を考える必要があるのかというと,
他人が勝手にDNSを設定して,
自分のWebサイトのIPアドレスを狙って
勝手に別のドメインから転送してくることも技術的に可能だから。

これはDNSの仕組み上,防ぎようがない。

なのでDNS側ではなく,Webサーバ側で対処する必要があるのだ。

DNSの設定をいたずらして、他のサイトのIPに勝手にほかのドメイ…
http://q.hatena.ne.jp/1245675246

  • DNSの設定をいたずらして、他のサイトのIPに勝手にほかのドメインを結びつけるようなことはできてしまうのでしょうか?
  • →できます。 あなたが「ほかのドメイン」のオーソリティー(所有者)であれば,そのドメインのFQDNをどのIPアドレスのAレコードあるいはCNAMEに設定するのもあなたの自由です。


某VPSにてWebサーバーを立ち上げました。 ドメインを取得してAレ…
http://q.hatena.ne.jp/1433155432

  • サーバーのアクセスログを見ると、自分が設定したドメインとは別のドメインでアクセスされている
  • 誰かが私のサーバーとそのドメインを勝手に紐付けた
  • このドメインからのアクセスを拒否することはできないのでしょうか?


DNSに関係したその他のトラブル:

さくらDNSにサブドメインハイジャックを許す脆弱性 | 徳丸浩の日記
http://blog.tokumaru.org/2012/06/saku...

  • 勝手にDNSサーバーを立てて他人のサブドメインを登録できることは問題ない
  • 第三者が独自のDNSサーバーを立てて、そこに勝手に別人のドメイン名を登録することはできてしまいます。
    • 私が運営するDNSサーバーに、google.comやamazon.comやapple.comなどを勝手に設定することできるし、問題にもならないということ
    • それが問題にならない理由は、この勝手なDNSサーバーは上位DNSサーバーからgoogle.comなどのドメイン名を委譲されていないので、どこからも参照されないから
  • 権威サーバーと同じサーバー上に、他人がサブドメインを登録できることが問題


凍結されたドメインを他人に取得され、こちらのサイトが無断複製されて公開されています 【OKWave】
http://okwave.jp/qa/q4846209.html

  • 支払いの不備で凍結されたドメインを凍結解除後に再取得しようとしたら別人に取得され、当方のサイトが無断でコピーされ、そっくりなサイトが勝手に公開されています。

関連する記事:

Apache HTTP Web Server 2.2/2.4の使い方・構築手順・設定方法を勉強するためのリンク集。入門用サイトでサーバ技術を身につける
http://computer-technology.hateblo.jp/entry/20141229/p1


SEOやWebサイト運営・ブログ集客などのノウハウを学ぶためのまとめ
http://computer-technology.hateblo.jp/entry/20150301/p2


URLの#(シャープ)から後の部分の名称=「ハッシュ」「フラグメント」「ページ内リンクアンカー」と,SEO対策上の重要性
http://computer-technology.hateblo.jp/entry/20141230/p1


WordPressが高負荷で動作できるレンタルサーバはどこか?
http://computer-technology.hateblo.jp/entry/20131107/p2