下記の様なhogeディレクトリの構成で
/hoge
.htaccess
index.html
http://sample.com/hoge/index/
とアクセスするとindex.htmlが一階層下に存在するとして表示されます。
※404エラーになりません。
これを正常に404エラーになるようにすればどこを調整すればいいのでしょうか?
ちなみに.htaccessは以下のように設定しています。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*) hoge.php
よろしくお願いいたします。
どのように動作させる事が望みでしょうか?
RewriteRule ^(.*) hoge.php
現在は、上記の記述により、すべてのアクセスが「hoge.php」を読み込んで表示する設定になっています。
単純に「.htaccess」と同じ階層(WEBルート)にあるファイルにアクセスした時だけ、「hoge.php」を読み込んで表示させたいという場合は、上記の記述を以下に変更してみてください。
RewriteRule ^([^/]*)$ hoge.php
もし、希望する動作と違う場合は、希望する動作の詳細を教えてください。
※コメント欄を開けて下さった方が、ちょっとしたやり取りなどし易いです。
URLはダミーです。
○sample.com/product/tokusyu.html→特集ページを表示
上記は正常な動作です。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
上記2行の記述で、「ファイルやディレクトリが存在しない場合」という条件をつけています。
「sample.com/product/tokusyu.html」は、ファイルが存在するので、そのまま「tokusyu.html」が表示されます。
×sample.com/product/tokusyu/→hoge.phpで処理がおこなわれずtyokusyu.htmlが表示される
こちらは想定外の動作をしています。
「sample.com/product/tokusyu/」は、「sample.com/product/tokusyu/index.html」(※DirectoryIndexの設定順で異なります。)へのアクセスですが、ファイルが存在しないはずですので、「hoge.php」を実行して結果を「sample.com/product/tokusyu/index.html」として表示するのが正常な動作です。
http://httpd.apache.org/docs/2.0/ja/mod/mod_dir.html#directoryindex
「product」が商品カテゴリのディレクトリ名でしょうか?
今回の問題とは関係ないと思いますが、一応「RewriteBase」を指定して置いた方が良いと思います。
※回答で『「.htaccess」と同じ階層(WEBルート)~』と書きましたが、正しくは『「.htaccess」と同じ階層(「hoge」=「product」ディレクトリ)~』です。m(__)m
下の階層が存在しなくて、尚且つ「sample.com/product/xxxxx/zzz.html」等、下の階層を指定したURLでのアクセスも無いのでしたら、回答した記述も試してみてください。
RewriteEngine On
RewriteBase /product
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ hoge.php
少し構成を変えて別のサーバー(さくらサーバー)で試してみました。
■構成
/blog.watuu.net(ルートディレクトリ)
.htaccess
index.html
/product(商品ディレクトリ)
index.html
tokusyu.html
hoge.php
■.htaccess
DirectoryIndex index.php index.html
RewriteEngine On
RewriteBase /product
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(/product/.*)$ hoge.php
■結果
商品ディレクトリの特集ページを表示
[OK] http://blog.watuu.net/product/tokusyu
[OK] http://blog.watuu.net/product/tokusyu.html
商品ページをのhoge.phpを利用して表示
[OK] http://blog.watuu.net/product/ZZZ/
[NG] http://blog.watuu.net/product/tokusyu/
やっぱりこれが正常な動作なのかなぁ。
サーバーがスラッシュをどんなに解釈してるかの問題っぽいですね・・・
さくらサーバは特定の拡張子は補完して表示してくれる(表示してしまう?)
みたいですね。私もindex.phpを表示する際にindexとだけ書いてしまったURLで
正しく表示されたことがあり、ちょっとびっくりした記憶があります。
「tokusyuu」ディレクトリ下など、特定のディレクトリへのアクセスがあった場合だけ404エラーを表示させるのが目的でしたら、以下のようにして除外ディレクトリを指定してみてください。
DirectoryIndex index.php index.html
RewriteEngine On
RewriteBase /product
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(tokusyuu)
RewriteRule ^(.*)$ hoge.php [L]
※上記は、「.htaccess」を「product」ディレクトリに設置する場合です。
WEBルートに設置する場合は、除外ディレクトリの指定行を「RewriteCond $1 !^(/?product/tokusyuu)」にしてください。
※「RewriteBase /product」を指定しているので、「RewriteRule」の条件に「^(/product/.*)$」のように「product」を含める必要はありません。
※「!^(tokusyuu|campaign)」のように「|」で区切ると複数のディレクトリを指定できます。
http://matsui.hamazo.tv/e1710565.html
下層のディレクトリへのアクセスすべてを404エラーにしたい場合は、既に回答やコメントで投稿していますが、以下のルールを試してみてください。
DirectoryIndex index.php index.html
RewriteEngine On
RewriteBase /product
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ hoge.php [L]
RewriteBase に 正規表現 に続き、
サーバー 拡張子 補完にかんする勉強もできました。
http://q.hatena.ne.jp/1162483008
さくらでは使えないようなんですが、
Options -MultiViews
って設定もあるんですね。
別のサーバーで使ってみてrouge_2008さんの書き方でうまくいきました。
ポイントの付け方がよくわからなく星をいっぱいつけてしまいました。
一旦終了させていただきます。
ありがとうございました。