.htaccessを使いエラーが起きたら飛ばす

このQ&Aのポイント
  • Apacheで.htaccessを使いアクセス制限をしようとしています。403エラーが起きたら指定のファイルにリダイレクトするというのを試みていますがうまくいきません。
  • .htaccessの意図は拡張子がhtmlとphpのファイルだけにアクセスを許可し、それ以外でアクセスしてきて403エラーが出た場合b.phpにリダイレクトすることです。
  • なぜかブラウザでa.phpにアクセスするとErrorDocument 403に引っかかりb.phpに飛んでしまいます。存在するファイルに対してエラーとなるのはなぜでしょうか。
回答を見る
  • ベストアンサー

.htaccessを使いエラーが起きたら飛ばす

Apacheで.htaccessを使いアクセス制限をしようとしています。 そして403エラーが起きたら指定のファイルにリダイレクトするというのを試みているのですがうまくいきせん。 問題点を絞るべくなるべく簡単にしてみました。 a.phpファイル (http://xxx.yyy.co.jp/ に存在します) <?php print("a"); error_log("a"); ?> b.phpファイル (a.phpと同様にhttp://xxx.yyy.co.jp/ に存在します) <?php print("b"); error_log("b"); ?> .htaccessファイル ErrorDocument 403 http://xxx.yyy.co.jp/b.php deny from all <Files ~ "\.(html|php)$"> allow from all </Files> この.htaccessの意図は拡張子がhtmlとphpのファイルだけにアクセスを許可します。 そしてそれ以外でアクセスしてきて403エラー(forbidden)が出た場合b.phpにリダイレクトしようとしています。(話を簡単にするため他のエラーについては省略します) 問題が出る流れ 1:まずブラウザでhttp://xxx.yyy.co.jp/a.phpにアクセスします。 2:なぜか ErrorDocument 403 に引っかかり http://xxx.yyy.co.jp/b.php に飛んでしまいます。 もちろんこのとき http://xxx.yyy.co.jp/ に a.php はちゃんと存在しています。 よって「ErrorDocument 403 http://xxx.yyy.co.jp/b.php」をまるごと.htaccessから削除してもう一度アクセスしても当然403エラーは出ません。 ちなみに本当にエラーだった場合の処理はうまくいっていて、存在しないファイルで例えば下記のようなURLでアクセスをした場合は正しく http://xxx.yyy.co.jp/b.php に飛びます。 http://xxx.yyy.co.jp/a.ccc 問題は何故エラーでもないのにErrorDocument 403で飛んでしまうのかです。 やはり.htaccessの設定の仕方が悪いのでしょうか。

  • PHP
  • 回答数3
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • wpwpwpw
  • ベストアンサー率38% (57/148)
回答No.1

記された内容通りにうちのサーバーでテストしてみましたが、 ご希望通りに動きました。 httpd.confかな?

ankodaisuki
質問者

お礼

原因が判明しました。 どうやらchromeだとfaviconにアクセスしているみたいです。 そしてfavicon.icoはdenyの範疇に入っているので403エラーが出てたようです。 皆さんありがとうございました。

ankodaisuki
質問者

補足

すいません、肝心なことを書き忘れていました。 ブラウザ上ではなぜか移動してない、つまりURLが変わっていないように見えるかもしれませんが、error_logで出力した内容を確認すると下記のようにa.phpからb.phpに移っています。 [24-Oct-2012 20:30:00] a [24-Oct-2012 20:30:00] b (但しURLが変わっている場合もあり、ちょっと挙動が不明です) ちなみに環境はレンタルサーバでhttpd.confはどうもいじれないようです。

その他の回答 (2)

  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.3

試してみたけど問題なく。 a.php自体で403が出てるとか、キャッシュとか・・・

ankodaisuki
質問者

補足

>a.php自体で403が出てるとか これってどういう意味でしょうか。 >キャッシュとか・・・ 一応スーパーリロードは試しましたがだめでした。 皆さんはちゃんと動いていて.htaccessにも問題がなさそうということで、ふと思いついていろんなブラウザで試してみました。 なんとfirefoxとsafariとieは問題なくちゃんと動作しました。 私が試していたのはchromeですが、このブラウザだけこの問題が起こるようです。chromeは現時点での最新版(ver22)で、PCはwindowsです。 chromeの持っているユーザーエージェントをsafariに設定してsafariでアクセスしても問題なく動作しました。 そこでchrome絡みのキーワードで検索してみましたら、同じような問題で苦労していた方がいました。 http://piyopiyocs.blog115.fc2.com/blog-entry-47.html この方の結論としてはchromeに問題があるのではないかということでした。 そして解決方法は ErrorDocument の行を削除するというものでした。 私としては403エラー(forbidden)だった場合、やはり別のファイルに飛ばしたいと思っています。(というか事情として必須です。) ただchromeに問題があるとすればこの記事から2年も経っているのに未だに修正されていないというのも不思議です。 尚繰り返しますが、a.phpからb.phpに移るといってもブラウザのURLの表示上は問題はなく変化していません。そうではなくPHPのerror_log関数で出力した内容を確認するとa.phpからb.phpに飛んでいる、というのが問題です。ブラウザはchromeです。 何か回避方法や対策などあればよいのですが。 引き続き皆さんの回答をお待ちしております。

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

denyやallowの記述の前にorderがないのは何故でしょうか。(書かなかったことがないので挙動はわかりませんが)orderが不定なのがマズイのではありませんか。 http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#order

ankodaisuki
質問者

補足

orderを入れてやってみましたが変化はありませんでした。 ErrorDocument 403 http://xxx.yyy.co.jp/b.php Order Allow,Deny deny from all <Files ~ "\.(html|php)$"> Order Deny,Allow allow from all </Files> 念のため二つのorderに対してAllowとDenyを前後に入れ替えた4つの組み合わせ全てを試しましたが、残念ながらやはりだめでした。

関連するQ&A

  • .htaccessの記述方法(このファイルを隠す。エラーページ)

    .htaccessファイルで下記のようなことをする記述方法を教えて下さい。 (1)指定ページが見つからない、削除されてしまったっ場合。 参考:http://allabout.co.jp/internet/hpcreate/closeup/CU20031019A/index2.htm ErrorDocument 404 /notfound.html (2).htaccess自体を隠す。 参考:http://htaccess.pasoa.com/itself.htm <Files ~ "^\.ht"> deny from all </Files> ファイルに <Files ~ "^\.ht"> deny from all </Files> ErrorDocument 404 /notfound.html 記述したのですが、エラーが出ました。 また、設置は、.htaccess・notfound.htmlをアスキーモードで、index.htmlと同じ位置にアップロードし、属性を606する。

    • ベストアンサー
    • HTML
  • .htaccessで

    .htaccessを用いて、ある特定のディレクトリ以下にアクセスされた 場合にだけ、指定したphpファイルへ飛ばすような設定をしたいと 考えています。 サーバー全体的には「ErrorDocument 404 /xxx/xxxxxxx.php」と言う 設定がされてあり、同じように特定のディレクトリでError 404が 検出されたときだけ上記とは違うphpファイルに飛ばしたいのです。 色々試してみて、「RewriteRule」で特定のディレクトリ以下への アクセスを指定したphpファイルへリダイレクトさせるようには 出来ているのですが、「ErrorDocument」で出来れば、そちらの方が 後に良いかもしれないと考えております。 良い方法は、ありませんでしょうか。

  • .htaccessについて

    「ロリポップレンタルサーバー」で.htaccessファイルを設置したのですが、 なぜか「500エラー」が出てしまいます。 何が原因なのか分からないでしょうか? 【問題の.htaccessファイル】 <Files ~ "^\.(htaccess|htpasswd)$"> deny from all </Files> Options +MultiViews Options -Indexes ErrorDocument 401 http://hoge.com/error/401.htm ErrorDocument 403 http://hoge.com/error/403.htm ErrorDocument 404 http://hoge.com/error/404.htm ErrorDocument 500 http://hoge.com/error/500.htm RewriteEngine on RewriteCond %{HTTP_HOST} ^(www\.hoge\.com)(:80)? [NC] RewriteRule ^(.*) http://hoge.com/$1 [R=301,L] DirectoryIndex index.htm Redirect permanent http://hoge.com/sub http://sub.hoge.com/ order deny,allow [EOF] ちなみに「.htaccess Editor」というサイトで作ったものを少しいじりました。

  • .htaccessは2つ置けないんでしょうか?

    携帯サイトをロリポップにて作成しています。 PCからアクセスした際、ソースを覗かれないようにするため IPアドレスによる制限をしています。 ファイル名.htaccess order deny,allow deny from all #Docomo IPアドレス #Vodafone IPアドレス #au(cdmaOne)とTu-ka IPアドレス #au(WIN) IPアドレス #au(BREW) IPアドレス 上記のファイルにてPCからのアクセスを防ぐ事が出来るのですが、 エラーページの設定も.htaccessにておこなっています。下記 ファイル名.htaccess ErrorDocument 401 http://URL ErrorDocument 403 http://URL ErrorDocument 404 http://URL ErrorDocument 500 http://URL 上記ファイルにてエラーページの設定は完了なのですが .htaccessを2つ置こうとすると、上書きされてしまい 一つだけになってしまいます。 2つの.htaccessを置きたい場合はどのようにしたら良いでしょうか? どなたかご存知の方、ご教授頂けると幸いです。 よろしくお願い致します。

  • アクセス制限について

    初めまして。 質問の内容ですが、www直下においてある.htaccessに動作確認の為自分のホストをdenyするように記述しても、フォルダBにあるファイルにアクセスできてしまいます。フォルダAのバナーは表示されなくなるのですが…。 ロボ避けが働かないと困るので、何とか機能させたいと思っています。ディレクトリの構成と内容は以下の通りです。 | .htaccess | フォルダA(直リンクバナーを置いています)   |-.htaccessなし | フォルダB(サイト本体です)   |-.htaccessあり | フォルダC(制限にかかった時表示するファイルを置いています)   |-.htaccessあり ==========直下の.htaccess=========== DirectoryIndex index.html .ht order allow,deny allow from all deny from xxx.xxx.xxx.xxx deny from 自分のホスト名 <Files ~ "^\.ht"> deny from all </Files> <Files robots.txt> order deny,allow allow from all </Files> ==========フォルダB=========== DirectoryIndex index.html .ht ErrorDocument 403 /フォルダC/403.html order allow,deny allow from all deny from yyy.yyy.yyy.yyy <Files ~ "^\.ht"> deny from all </Files> ====================== です。長くてすみません。 以前動作確認した時はちゃんと弾かれていたのですが、最近フォルダBにある.htaccessを編集した時に再度動作確認してみると弾かれなくなっていました。 フォルダBに自分のホストをdenyするように書くとちゃんと機能します。どの辺りをいじればいいでしょうか?

    • ベストアンサー
    • HTML
  • htaccessで、特定IP以外をリダイレクトさせたい。

    初心者です。 .htaccessを使ってメンテナンス画面を表示させようと思っています。 条件として、 ・特定のファイルへのアクセスを、リダイレクトさせる。 ・動作確認を行うため、自分のIPの場合はリダイレクトさせない。 ファイルに対してのリダイレクトは、 Redirect /aaa/aaa.php /maintenance/maintenance.html 特定IPに対して、ディレクトリ単位のリダイレクトは、 order deny,allow deny from all allow from xxx.xxx.xxx.xxx ErrorDocument 403 /maintenance/maintenance.html というところまでは解決したのですが、 「特定IPに対して、ファイル単位のリダイレクト」 は、どのように指定すればよいのでしょうか?

    • ベストアンサー
    • HTML
  • htaccessでのErrorDocumentが出来ない…

    初めての質問なので、おかしな所があったら突っ込んでやってくださいm(_ _)m サーバーはApacheの2.0.53を使っています。 OSはWindowsXPです。 htaccessのErrorDocumentを使って、エラーページに自分で作ったものを表示させようと思ったのですが、500の内部エラーがでてしまいました。 「ErrorDocument 404 /404.html(改行)」 という設定で、404.htmlファイルはhtaccessと同じディレクトリにおいてあります htaccess自体はホスト制限の order allow,deny allow from all deny from ---.---.--.-- 等の設定で動作してるのでhtaccessが使えないということは無いと思います。 Apacheのエラーログには ErrorDocument not allowed here と表示されていますが、いまいち理解ができなくて困っています。 何か手がかりだけでもいいので教えてもらえないでしょうか?お願いしますm(_ _)m

  • 「htaccess」と「jsファイル」について

    csvとjsを読み込んで表示させているPHPスクリプトがあります。 ■htaccess <Files ~ ".(dat|log|csv|txt)$"> deny from all </Files> この状態では、問題ないです。 ・csvファイルには、ブラウザから直接アクセスできない。 ・csvファイル自体は、ファイルに読み込まれ、結果が画面に正常表示されている。 ところが、拡張子にjsファイルを追加したところ、 画面上で、そのjsスクリプト部分がまったく読み込まれないようになりました。 <Files ~ ".(dat|log|csv|txt|js)$"> deny from all </Files> ■質問内容 拒否ファイルにcsvがあっても、csvファイルは読み込めたのに、 拒否ファイルにjsを指定すると、なぜ、読み込めなくなるのでしょうか? jsはクライアントサイドの処理で、 csvファイルはサーバサイドのPHPを利用して読み込んでいるからなのでしょうか? deny from all って、アパッチの設定か何かなのでしょうか? 具体的に何をしているのでしょうか?

  • .htaccessの記述間違いを教えてください

    .htaccessを使用して、アクセス制御を行おうとしたのですが、アップロードしてアクセスしてみるとすべてのアクセスがブロックされてしまいました。 制御したい事柄は以下の通りです。 ファイルの「.htaccessと.htpasswdと.class.php」にはアクセスできないようにすること。 IPアドレス88.80.10.1は、アクセス拒否 ユーザーエージェントの「MorfeusとZmEu」の名前がつくものは、FORBIDDEN を返すというものです。 以下 .htaccess の記述内容 ----------------------------------- <Files ~ "^\.(htaccess|htpasswd)$"> deny from all </Files> <Files ~ "\.class\.php$"> deny from all </Files> Order allow,deny Deny from 88.80.10.1 RewriteEngine On RewriteOptions inherit RewriteCond %{HTTP_USER_AGENT} ^Morfeus RewriteRule ^.*$ - [F] RewriteCond %{HTTP_USER_AGENT} ^ZmEu RewriteRule ^.*$ - [F] ----------------------------------- 何卒よろしくお願いいたします。

  • .htaccessファイル

    ロリポップでサーバーをレンタルしています。 エラー表示画面を自作で作り 「ErrorDocument 404 http://xxx.xx.jp/error/404.html」 上記内容で.htaccessファイルを作り使用しています。 このような状況の中、 最近海外からの妙なアクセスが増えて来たので制限をかけたいのですが、 現在の↑.htaccessのファイルに下記のようにそのまま続けて書いて行ってよいのでしょうか? (↓.htaccessでjpドメイン以外を弾く) order deny,allow  deny from all    allow from .jp ・エラー表示は今まで通りそのまま使いたい ・アクセス制限をかけたい 以上、 書き方が分からず悩んでいます。 ご教示お願いいたします。。