• ベストアンサー
  • すぐに回答を!

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

  • 質問No.7764328
  • 閲覧数357
  • ありがとう数1
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 61% (42/68)

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の設定の仕方が悪いのでしょうか。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 38% (57/148)

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

お礼率 61% (42/68)

すいません、肝心なことを書き忘れていました。

ブラウザ上ではなぜか移動してない、つまりURLが変わっていないように見えるかもしれませんが、error_logで出力した内容を確認すると下記のようにa.phpからb.phpに移っています。
[24-Oct-2012 20:30:00] a
[24-Oct-2012 20:30:00] b
(但しURLが変わっている場合もあり、ちょっと挙動が不明です)

ちなみに環境はレンタルサーバでhttpd.confはどうもいじれないようです。
投稿日時:2012/10/24 20:53
お礼コメント
ankodaisuki

お礼率 61% (42/68)

原因が判明しました。

どうやらchromeだとfaviconにアクセスしているみたいです。
そしてfavicon.icoはdenyの範疇に入っているので403エラーが出てたようです。

皆さんありがとうございました。
投稿日時:2012/10/26 17:48

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 63% (239/379)

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

お礼率 61% (42/68)

>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です。


何か回避方法や対策などあればよいのですが。
引き続き皆さんの回答をお待ちしております。
投稿日時:2012/10/26 00:55
  • 回答No.2

ベストアンサー率 54% (865/1590)

denyやallowの記述の前にorderがないのは何故でしょうか。(書かなかったことがないので挙動はわかりませんが)orderが不定なのがマズイのではありませんか。

http://httpd.apache.org/docs/2.0/ja/mod/mod_access.html#order
補足コメント
ankodaisuki

お礼率 61% (42/68)

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つの組み合わせ全てを試しましたが、残念ながらやはりだめでした。
投稿日時:2012/10/24 23:23
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,600万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ