「.htaccess」による参照元アクセス制限

[統計] HTMLからXHTMLへの移行を進めていますか?



0   名前: けろ : 2006/07/16(日) 14:56  ID:e8thtM5H
私は「.htaccess」を使い、以下のようにしたいと考えています。

(アドレスは例)
http://www.abcdef.jp/html/index.html へは、リンクを貼ってもらったりする
のにアクセス許可をしたいです。また直接アクセスも許可。
しかし、http://www.abcdef.jp/html/index.html 以外の全てのファイルは、
直リンク禁止(直接アクセスも禁止)にしたい。

要は、「http://www.abcdef.jp/html/index.html」(入り口ページ)からアクセ
スされた(参照元アドレス)ページについては、/html/サイト内のファイルにア
クセス(/html/main.htmlや/html/link/index.htmlなどのサイト内へのリンク
や画像等の表示)できるが、http://www.abcdef.jp/page/main.html など、
直リンクや直接アクセスされた時にはアクセス拒否(403 Forbidden)
をしたいという事です。

色々と、サイトを見回ったり質問をしたのですが、「サーバーの環境によって
使えない」などの一言で、解決できませんでした。
どうぞ、よろしくお願いします。

1   名前: 匿名 : 2006/07/16(日) 14:56  ID:7RZwl2r.
なんで直リンク禁止にしたいんですか?
見られないと困る、というならばそれはリンク張る側の責任でしょう。

2   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
お返事ありがとうございます。
「(直リンクや直接アクセスをされて)見られて困る」と
いうわけじゃないんです。index.htmlの「入り口」のページ
に「アクセスログ」を取得するのにスクリプトを記述してます。
でも、他のページには記述していないので、どうしても“玄関”で
あるindex.htmlから入って頂きたいのです。そうすれば、
アクセスログ取得する意味もありますし。

3   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
要は referer(参照元アドレス) が http://www.abcdef.jp/html/index.html 以外の時にアクセスを禁止したい、ということでしょうか。
そうすると、refererを出せない環境ではどうやってもアクセスできなくなってしまいますが、それでも良いですか?

4   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
お返事ありがとうございます。

http://www.abcdef.jp/html/index.html は「玄関」なので、
玄関以外からの進入(アクセスやリンク)を拒否したいのです。
またアクセスログの記録もございますし。
(HTMLファイル以外、画像ファイル等もアクセス禁止に)

ちなみに、「refererを出せない環境」との事ですが、
Symantecの「Norton Internet Security」の一部で、
参照元 (リファラ) が遮断され、アクセスできない事例が
あるようです。
http://service1.symantec.com/SUPPORT/INTER/nisjapanesekb.nsf/jp_docid/20021020160209947
このようなソフトをご利用の方には、入り口ページで
「こうして下さい」と案内をしようかと思います。

ご回答お待ちしております。
ちなみに、webサーバのOSはRed Had 7.* との事です。
この場合の記述の仕方をご連絡ください。
またご案内後、試してみて、うまく出来たか出来ないか、
結果をご連絡します。

5   名前: 匿名 : 2006/07/16(日) 14:56  ID:7RZwl2r.
>>4
Firefoxでもリファラー教えないようにできますがどうするんですか?

なんかアクセスログ取りたい、ってだけでこういう面倒くさいことするのは無駄かと。
有料のレンタルサーバーとかなら、なにも記述しなくても解析できたりしますよ。

6   名前: のっと : 2006/07/16(日) 14:56  ID:943Mtr/I
というか、アクセスログをとりたいだけならば全てのページにスクリプトを埋め込めばいいだけでは。

7   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
お返事ありがとうございます。

>>5 >>6

「Firefox」とはなんでしょう。分かりません。
全てのHTMLファイルに、アクセスログのスクリプトを記述
したらよいのではないかとの事ですが、それは希望しません。

なぜ、index.html以外のアクセスを拒否したいかという理由は、
自分の知らぬ所でリンクなり、index.html以外のファイルの
URLを伝えられ、アクセスされるのが精神的(気持ち的に)
嫌なんです。ですので、index.html以外は直リンクや直接アクセスを
拒否しようと思いまして。

私が希望する運営の仕方を、なかなかご理解いただけないと思いますが、
すみません。

8   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
> ちなみに、「refererを出せない環境」との事ですが、Symantecの「Norton Internet Security」の一部で、参照元 (リファラ) が遮断され、アクセスできない事例があるようです。

> このようなソフトをご利用の方には、入り口ページで「こうして下さい」と案内をしようかと思います。

ええと、Norton Internet Security 以外にも firefox やら Opera やら一部の ISP 系列やら、イロイロあるのですが、とにかくそういう環境は(refererを吐くようになんとかしない限り)アクセスできなくても宜しいということですね?

9   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
お返事ありがとうございます。
>>8

> ええと、Norton Internet Security 以外にも firefox やら Opera やら一部の
> ISP 系列やら、イロイロあるのですが、とにかくそういう環境は(refererを吐く
> ようになんとかしない限り)アクセスできなくても宜しいということですね?

はい。その辺は大丈夫です。
ちなみに、ISP(Internet Service Provider)でも、referer(参照元)を遮断
するという所があるんですか。おどろきです。
では、記述の仕方のご連絡をお待ちしております。

10   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
あ、そうだ。

>>0
> 色々と、サイトを見回ったり質問をしたのですが、

他の掲示板で同じ質問をすることをマルチポストと言うのですが、この掲示板では原則的に禁止されています。
ただし、条件付きで認められるので、「はじめにお読みください」をご参照ください。
http://www.tagindex.com/bbs/note.html

11   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
> はい。その辺は大丈夫です。

ええと、では "referer htaccess" で google検索すると、うんざりするほどヒットしますが。

12   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
マルチポストの件ですが、1つの掲示板にだけ投稿しましたが、
回答が返ってきませんでした。
URL(2chです):http://pc8.2ch.net/test/read.cgi/hp/1128774075/l50

私が投稿した記事は以下の番号です。
912 , 915 , 917 , 920 , 922 , 925 , 926 , 929 , 930 , 933

※こちらの掲示板で解決しましたら、2chのサイトの方にも、URLを
 明記の上、ご報告させて頂きます。

13   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>11

ご回答ありがとございます。

私の方ても、こちらに投稿する前に検索をしてみました。
それで以下の記述で試しました。

SetEnvIf REFERER "abcdef.jp/html/" Ref1
order deny,allow
deny from all
allow from env=Ref1

すると、http://www.abcdef.jp/html/ (index.html)
にアクセスすると、早速「アクセス権限なしのエラー」となりました。
ですので、どうすればいいのかと思いまして。

ちなみに、私のパソコンの環境は、IE6 SP2です。

14   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
> ※こちらの掲示板で解決しましたら2chのサイトの方にも、URLを
>  明記の上、ご報告させて頂きます。

残念ですが、解決する前に報告してください。

http://www.tagindex.com/bbs/note.html
> マルチポスト先のURLを提示してください。
> 上記の2点(マルチポストの明記とURLの提示)は、当掲示板だけでなく全てのマルチポスト先で行う必要があります。

15   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>14

失礼しました。
2chのサイトの方に、ただいま報告させていただきました。
こちらのURLを貼りましたのでご連絡いたします。

16   名前: カヅサツ ◆ThCi95HEzw : 2006/07/16(日) 14:56  [URL]  ID:f0UXxXRM
.をエスケープしていないからではないかと思います。
(すいません、久々に apacheを起動したら挙動が変で、私は確認していません)

SetEnvIf REFERER "abcdef.jp/html/" Ref1


SetEnvIf REFERER "abcdef\.jp/html/" Ref1



17   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>16
ご回答と記述の訂正ありがとうございます。
早速試してみましたが、全て403 Forbiddenとなりました。
まずは、
http://www.abcdef.jp/html/ にアクセスしたら403 Forbiddenとなります。
http://www.abcdef.jp/html/main.html に直接アクセスしても403となる
のはよい事なのですが。
ちなみに、上記で(私が投稿したもので)サーバーのOSを書いていますが、
それはapacheだろうと、Red Had 7.* だろうと、htaccessの記述には
問題なく動作しますよね。

こちらの環境で、/html/index.html にアクセスした際に403エラーになる
のであれば、サーバーの仕様も考えられますので、諦めます。

カヅサツさんを含め、他の皆様、ご回答ありがとうございました。
とりあえず、まだどうか分からないので(参照元制限が可能か)、
カヅサツさんの回答をお待ちして、私がレスしたらこの件については
終了とさせていただきます。(よろしいでょうか?)

18   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
追記します。
ちょっと疑問に思ったのですが、

SetEnvIf REFERER "abcdef\.jp/html/" Ref1

という事は、http://www.abcdef.jp/html/index.html も(index.html)
「参照元制限」が掛けられているので、403のエラーになるという事でしょうか。
と考えれば、index.htmlファイルのみは“参照元制限をなしにする”という
設定であれば、index.htmlは開ける事になりますよね。
私の考え間違いでしょうか。

19   名前: Chip : 2006/07/16(日) 14:56  ID:iXTrKUp6
単純にその記述と構成では
index.htmlにアクセスした場合も、リファラがindex.htmlでなければならないと宣言してしまっているのでは?
フォルダ構成を変えるとか、記述にもうちょっと条件を足すとかしないとダメかも。

あと、refererは送出されないケースがあると共に偽装も可能ですので100%確実なチェックにはなり得ませんがその辺は大丈夫でしょうか?
(精神的な満足度を得られればいいだけなら現実的には充分だとも思いますが)

20   名前: Chip : 2006/07/16(日) 14:56  ID:iXTrKUp6
のんびり書いていたら前後してしまいました。
ご自身で気づかれましたね。

もう少し詳しく書くとindex.html以外のファイル同士のリンク(画像等の参照も含む)も制限を受ける。
http://www.abcdef.jp/html/ の、ようにindex.htmlを省略してアクセスした場合もやはり制限を受ける。
等まだ問題が出るかもしれませんので記述を色々工夫してください。


あと注意事項の追加。
SEO的には最悪。検索エンジンがクロールできないので検索エンジン経由の集客は望めなくなります。

21   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>19
ご回答ありがとうございます。

> フォルダ構成を変えるとか、記述にもうちょっと条件を足すとかしないとダメかも。

これは例えば、
http://www.abcdef.jp/html/index.html は .htaccess 置かずに
http://www.abcdef.jp/html/mainpage/index.html に .htaccess を
上記の記述でやればOKという事ですよね。
そうすると、現在作成したページのリンクの手直しなどしなければならず、
また、URLが余計に長くなってしまうので、これは妥協できませんね。
(わがままを言ってすみません)

> あと、refererは送出されないケースがあると共に偽装も可能ですので
> 100%確実なチェックにはなり得ませんがその辺は大丈夫でしょうか?

「偽装もある」ですか。私が考えるに、インターネットの一般ユーザーは
偽装なんてしないでしょう。趣味でインターネットを楽しむユーザーは。
でも、何か技術(?)を持ってネットしている人は、偽装してページを
見ているカモと考えられますけどね。確かに。

私が知る限り、Norton Internet Security以外に、refererを送信しないのは
どんなケースなんだろうと疑問なんです。ウイルス駆除ソフト
(Nortonに限らず)を導入している人すべてがそうであるのかどうかは
分かりませんけど。また、利用されるブラウザ(IE以外)にも関係してくる
のでしょうけど。私としては「IEを利用している人向け」に作っている
ページですので、「ブラウザがIEではない方はIEを使ってくださいね」とでも
宣伝して回避したいと考えています。

22   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>20
ご回答ありがとうございます。

> あと注意事項の追加。
> SEO的には最悪。検索エンジンがクロールできないので検索エンジン経由の
> 集客は望めなくなります。

SEOとはなんでしょう。
ちなみに、検索エンジン経由でとの事ですが、私のサイトはrobots.txtを
置いて、全てのロボットの検索エンジンに対して、巡回しないように設定
してありま。また念のため、HTMLファイルにも、メタタグで記述しております。

23   名前: Chip : 2006/07/16(日) 14:56  ID:iXTrKUp6
色々いらぬおせっかいを書きましたがおおむねご理解されている通りです。

FirefoxやSEOなどのわからない単語に遭遇したらとりあえず検索して調べてみてください。

>現在作成したページのリンクの手直しなどしなければならず、
>また、URLが余計に長くなってしまうので、これは妥協できませんね。

結構面倒な事をやろうとしていますのでサイト構成の見直しも視野に入れておいた方が後々楽になる場合もあります。
(そうした事をするのに向いているフォルダ構成と向いていない構成があります。)
が、とりあえず現状で希望通りに動作するよう理解を深め、工夫してみて下さい。で、行き詰ったらもう少し具体的なフォルダ構成なんかを提示してアドバイスを求めるといいかと思います。

24   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>23
ご回答ありがとうございます。

「FirefoxやSEO」については調べて理解しました。ありがとうございました。

さて本題の記述にまいりますが。

<Files index.html>
order allow,deny
allow from all
</Files>
SetEnvIf Referer "abcdef\.jp/html/" Ref1
order deny,allow
deny from all
allow from env=Ref1


としました。すると、
http://www.abcdef.jp/html/index.html にはアクセスができて、次のページの
http://www.abcdef.jp/html/main.html にも(参照元を見て)リンク出来ます。
また、直接http://www.abcdef.jp/html/main.html にアクセスすると403エラー
になります。

しかし、ここで問題が1つ、いや2つでてきました。それは以下の通りです。
【その1】
http://www.abcdef.jp/html/index.html にはアクセスは出来る。しかし、
http://www.abcdef.jp/html/(index.htmlなし)には403エラーとなる。

【その2】
<Files index.html>
order allow,deny
allow from all
</Files>

とする事は
http://www.abcdef.jp/html/link/index.html も開けてしまう。
http://www.abcdef.jp/html/main.html からリンクページを開いて欲しい。

という場合には、<Files 〜>ではなく、別の記述になるのでしょうか。
<Files /html/index.html>としましたが、ダメでした。

ご回答お待ちしております。

25   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>24 に対しての訂正(?)追記です。
【その2】についてですが、

/html/link/ のディレクトリの中に、同じく .htaccess を置いて、
今度はその記述を

SetEnvIf Referer "abcdef\.jp/html/" Ref1
order deny,allow
deny from all
allow from env=Ref1

のみにするば、回避できるという事でしょうかね?。

26   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>25 の実験結果です。
/html/link/index.html へ直接アクセスした時に、エラーではなく
アクセスできてしまうという件についてです。
/html/以下の各ディレクトリの中に以下を記述した .htaccess を設置
する事により回避できました。


<Files index.html>
order deny,allow
deny from all
</Files>
SetEnvIf Referer "abcdef\.jp/html/" Ref1
order deny,allow
deny from all
allow from env=Ref1

あとは【その1】の問題のみです。

27   名前: けろ : 2006/07/16(日) 14:56  ID:aLJGbQsz
>>26 についてです。
「回避できました」とお伝えしましたが、>>26 の記述で
/html/main.html からサイト内のリンクで /html/link/index.html に
アクセスしたら、403の権限無しエラーとなりました。
これはどうすべきかと考えた結果、私の小さな頭で出た回答は以下です。
/link/index.html ではなく /link/link.html というファイル名にすれば、
回避できるのではないかと。

その他にもいい案がございますでしょうか?。

一人で掲示板に書き込みして申し訳ありません。

28   名前: けろ : 2006/07/16(日) 14:56  ID:Ag/pCGjG
ところで >>24 の「その1・その2」はどう回避すべきでしょうか。
キーワード色々試し、検索してみたのですが、見つかりませ。

お返事お待ちしています。

29   名前: Script41 : 2006/07/16(日) 14:56  ID:8vUmtKjp
SetEnvIf Request_URI "index.html" Ref1
SetEnvIf Referer "abcdef\.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2
ErrorDocument 403 http://abcdef.jp/html/index.html
ErrorDocument 404 http://abcdef.jp/html/index.html


エラー表示ページへの遷移は出来ませんけれど、このあたりが妥協点になりませんか?

・.htaccessは、htmlディレクトリ内に設置
・リクエストURIが、当該ディレクトリ内のindex.htmlであれば、Ref1として設定
・リファラがabcdef.jp/html/であれば、Ref2として設定
・基本的にアクセス拒否設定(deny from all)
・Ref1(index.html)へのアクセスであれば許可(Ref1の条件を満たす)
・リファラ(abcdef.jp/html/)ありのアクセスであれば許可(Ref2の条件を満たす)
・リファラ情報を提供しないアクセスでも、index.htmlは表示可能
→ ゆえに、ここに注意書きを掲載

・/html/(スラッシュエンド)でのアクセスの場合は、アクセス不許可(Error403)により
index.htmlに飛ばされるが、飛ばされた時点でRef1の条件を満たすため表示可能
要するに、http://abcdef.jp/html/ へのアクセスは、
http://abcdef.jp/html/index.html に変換される。
・存在しないファイルへのアクセスは、FileNotFound(Error404)により
index.htmlに飛ばされる。


30   名前: Script41 : 2006/07/16(日) 14:56  ID:8vUmtKjp
一部修正です。
一行目は、階層も指定しないと /link/index.html なども許可対象になってしまいますね。

SetEnvIf Request_URI "/html/index.html" Ref1


31   名前: けろ : 2006/07/16(日) 14:56  ID:Ag/pCGjG
>>29 >>30
ご回答ありがとうございます。
さて、試してみました。

<Files index.html>
order deny,allow
deny from all
</Files>
SetEnvIf Referer "abcdef\.jp/html/" Ref1
order deny,allow
deny from all
allow from env=Ref1


私が書いた上記記述と、ご案内いただきました下記記述

SetEnvIf Request_URI "index.html" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2


denyは拒否でallowは許可ですよね。
少し(いや、かなり)勉強をしなくては意味が分からなくなってきました。

ご案内いただいた記述の仕方で/html/内に.htaccessを置きました。
すると、www.abcdef.jp/html/ ではエラーになり、www.abcdef.jp/html/index.html
ではアクセス成功です。
また、直接www.abcdef.jp/html/main.htmlとアクセスしたら403のエラーと
なりました。
ちなみに、www.abcdef.jp/html/link/index.html に直接アクセスすると、
表示されてしまうので、これはやはりwww.abcdef.jp/html/link/link.html
などにファイル名を index.html 以外にして回避すべき事なのだと実感しました。

ちなみに、 ErrorDocument については、401,403,404,405と設定済みなので
変更するのは難しいかな。なので、リンクを貼っていただくときに、相手方に
ご面倒をお掛けする事にはなりますが、/html/index.html でファイル名まで
付けて頂くようにしたいと思います。
でも、
ErrorDocument 403 http://abcdef.jp/html/index.html
なら、変更しても大丈夫かな。(優柔不断でごめんなさい)

>>30

> 一部修正です。
> 一行目は、階層も指定しないと /link/index.html なども許可対象になって
> しまいますね。

あの、すみません。頭がこんがらがってきました。
どのような意味でしょうか。

32   名前: Script41 : 2006/07/16(日) 14:56  ID:8vUmtKjp
参考情報
http://httpd.apache.org/docs/2.0/ja/mod/mod_setenvif.html#setenvif

SetEnvIfは、指定した条件(第一引数+第二引数)に合致する要求があった際に、
最後の引数で指定した環境変数をセットします。

なので、
SetEnvIf RequestURI "index.html" Ref1
のままだと、/html/index.html 宛てのリクエストも、/html/link/index.html と場合も、
両方が Ref1 にセットされてしまいます。

ですので、
SetEnvIf "/html/index.html" Ref1
と記述を修正することで、/html/index.html は、合致しているので Ref1 がセットされ、
/html/link/index.html 宛てのリクエストは、合致しない (Ref1 がセットされない)
ということになります。

また、.htaccess は、当該ディレクトリを含む階層下に対して影響します。
(逆にいうと、当該ディレクトリと同階層の他のディレクトリおよび上位のディレクトリには
影響を及ぼさないはずです。)

このため、サイト全体でErrorDocument403が指定されているときでも、当該ディレクトリ内の
.htaccessで指定したErrorDocument403は、当該ディレクトリ内の403エラーの際にのみ有効です。

まあ、あとは情報を検索しながら、条件をいろいろと変えながら試して頂ければ、感覚的に理解できるのではないかと思います。

33   名前: けろ : 2006/07/16(日) 14:56  ID:Ag/pCGjG
>>32
ご回答ありがとうございます。また、丁寧なご説明で、意味が理解できました。

SetEnvIf Request_URI "/html/index.html" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2


1行目を訂正しましたところ、
/html/link/index.html は /html/index.html から /html/main.html にアクセス
してからでないと /html/link/index.html は開けないようになりました。
ありがとうございます。

これで、私の望みが出来ました。皆々様、ありがとうございました。
あとは、「ErrorDocument403」ですね。
/html/ にアクセスして403のエラーが出た時に、自動で(メタタグ)
/html/index.html にジャンプするよりかは、手動でジャンプしてもらった
ほうがよいのでしょうかね。「ここをクリックしてトップページからお入り
下さい。」のように。

色々と、情報ありがとうございました。
私としましてては、この件についてクローズ(終了)させて頂きたいと思いま
す。
他の方で、何かあれば、レスをお願いします。
念のため、こちらの掲示板はチェックに伺います。

34   名前: けろ : 2006/07/16(日) 14:56  ID:Ag/pCGjG
肝心な事をお伺いするのを忘れておりました。
SetEnvIf Request_URI "/html/index.html" Ref1
SetEnvIf Referer "abcdef.jp/html/" Ref2
order deny,allow
deny from all
allow from env=Ref1
allow from env=Ref2

として、/html/ にアクセスした方にたいし403でエラーメッセージで
「こちらをクリックして、ここから入ってね」というメッセージについてです。
/html/error/403.html
など置く場合ですが、/error/ のディレクトリの中も、一つ上のディレクトリに
置いた.htaccess(上記記述)が有効になって、表示されないかと思います。
この場合は /error/ の中には、どんな記述をした .htaccess を置けば
いいのでしょうか。

度重なるご質問で申し訳ありません。
ご回答お待ちしております。

35   名前: けろ : 2006/07/16(日) 14:56  ID:Ag/pCGjG
もしかして >>34 の解決方法は /error/ ディレクトリに
以下の.htaccessを記述すればいいのですか?
order allow,deny
allow from all

そとも
order allow,deny
deny from all
allow from all

でしょうか。

一覧へ戻る