Apacheのmod_rewriteによる設定でルートを除外したい

DocumentRoot下に
 index.php
 abc.php
というファイルと
 prg/
 aaa/
というディレクトリがあり、
~.jp/bbb
など指定していないディレクトリ参照のアクセスの場合にmod_rewriteでprg内へrewriteして処理させたいと考えています。
(prgディレクトリ内はindex.phpとdef.phpのみ)
現在、
RewriteEngine On
RewriteCond %{REQUEST_URI} !^/index.php
RewriteCond %{REQUEST_URI} !^/abc.php
RewriteCond %{REQUEST_URI} !/?prg/?
RewriteCond %{REQUEST_URI} !/?aaa/?
RewriteRule ^\/([0-9a-zA-Z_\-]+)\/? /prg/index.php [L]
RewriteRule ^\/([0-9a-zA-Z_\-]+)\/index.php /prg/index.php [L]
RewriteRule ^\/([0-9a-zA-Z_\-]+)\/def.php /prg/def.php [L]
と定義したところ、
~.jp/index.php:rewriteしない
~.jp/abc.php:rewriteしない
~.jp/aaa:rewriteしない
~.jp/aaa/:rewriteしない
~.jp/bbb:rewriteする
~.jp/bbb/:rewriteする
~.jp/bbb/def.php:rewriteする
と希望通りなのですが、
~.jp/
~.jp
というルート直下へアクセスした場合にrewriteされてしまいます。
どうすればこれを回避することができるでしょうか?

回答の条件
  • 1人5回まで
  • 登録:2013/08/28 11:36:14
  • 終了:2013/09/04 09:46:02

ベストアンサー

id:tezcello No.1

tezcello回答回数457ベストアンサー獲得回数682013/08/28 20:42:22

> 指定していないディレクトリ参照のアクセスの場合にmod_rewriteでprg内へrewrite
「存在していないディレクトリ」ですね?
後半のテストの部分から、存在していないファイルへのアクセスのも場合も rewrite したいのだと思います。

今後もルートにファイルやディレクトリが増えないのなら、個別に書くのもアリかもしれませんが、態々個別に書くよりは
「存在しないファイルやディレクトリへのアクセス」の場合 rewrite する
の方がわかり易くないですか?
それとも、何か見落としている所があるでしょうか?

DirectoryIndex index.php

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ prg/index.php [L,QSA]

これでは思ったように機能しませんか?

他6件のコメントを見る
id:tezcello

今更ですが、実際に使っている .htaccess と、アクセスするURL、その時に起きる不具合をセットでご提示ください。
そして、.htaccess は間違いなくルートに置かれていますよね?
(こんな配置)
DocumentRoot
├ prg/
│ ├ index.php
│ ├ def.php
├ aaa/

├ index.php
├ abc.php
├ .htaccess


>  RewriteCond %{REQUEST_FILENAME} !-f
>  RewriteCond %{REQUEST_FILENAME} !-d
> の使用には何か制限・設定があるのでしょうか?
RewriteCond 条件1
RewriteCond 条件2
RewriteRule ルール1
RewriteRule ルール2
このように書いた場合に、ルール1に対しては、条件1 and 条件2が適用されますが、ルール2に対しては適用されないというくらいだと思います。

2013/09/03 23:36:33
id:naonaosnf

本当にありがとうございます。
現在、.htaccessは使用せずhttpd.conf内の<VirtualHost>直下に
DirectoryIndex index.php
RewriteEngine On
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/?prg/?
RewriteRule ^.*$ /prg/index.php?name=$1 [L,QSA]
と記述しているのですが、
~.jp/
~.jp
などのドメイン直下指定のアクセスやファイルが存在する
~.jp/index.php
~.jp/aaa/index.php
にアクセスしても前コメント欄の通り
RewriteCond: input='/index.php' pattern='!-f' => matched
のようになり、rewriteされたページが表示されてしまいます。
~.jp/prg/内へのアクセスはログはpattern='!/?prg/?'でnot-matchedになっております。

2013/09/04 09:29:03

その他の回答(0件)

id:tezcello No.1

tezcello回答回数457ベストアンサー獲得回数682013/08/28 20:42:22ここでベストアンサー

> 指定していないディレクトリ参照のアクセスの場合にmod_rewriteでprg内へrewrite
「存在していないディレクトリ」ですね?
後半のテストの部分から、存在していないファイルへのアクセスのも場合も rewrite したいのだと思います。

今後もルートにファイルやディレクトリが増えないのなら、個別に書くのもアリかもしれませんが、態々個別に書くよりは
「存在しないファイルやディレクトリへのアクセス」の場合 rewrite する
の方がわかり易くないですか?
それとも、何か見落としている所があるでしょうか?

DirectoryIndex index.php

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ prg/index.php [L,QSA]

これでは思ったように機能しませんか?

他6件のコメントを見る
id:tezcello

今更ですが、実際に使っている .htaccess と、アクセスするURL、その時に起きる不具合をセットでご提示ください。
そして、.htaccess は間違いなくルートに置かれていますよね?
(こんな配置)
DocumentRoot
├ prg/
│ ├ index.php
│ ├ def.php
├ aaa/

├ index.php
├ abc.php
├ .htaccess


>  RewriteCond %{REQUEST_FILENAME} !-f
>  RewriteCond %{REQUEST_FILENAME} !-d
> の使用には何か制限・設定があるのでしょうか?
RewriteCond 条件1
RewriteCond 条件2
RewriteRule ルール1
RewriteRule ルール2
このように書いた場合に、ルール1に対しては、条件1 and 条件2が適用されますが、ルール2に対しては適用されないというくらいだと思います。

2013/09/03 23:36:33
id:naonaosnf

本当にありがとうございます。
現在、.htaccessは使用せずhttpd.conf内の<VirtualHost>直下に
DirectoryIndex index.php
RewriteEngine On
RewriteLog /tmp/rewrite.log
RewriteLogLevel 9
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/?prg/?
RewriteRule ^.*$ /prg/index.php?name=$1 [L,QSA]
と記述しているのですが、
~.jp/
~.jp
などのドメイン直下指定のアクセスやファイルが存在する
~.jp/index.php
~.jp/aaa/index.php
にアクセスしても前コメント欄の通り
RewriteCond: input='/index.php' pattern='!-f' => matched
のようになり、rewriteされたページが表示されてしまいます。
~.jp/prg/内へのアクセスはログはpattern='!/?prg/?'でnot-matchedになっております。

2013/09/04 09:29:03
id:naonaosnf

質問が自動終了してしまいますので、
http://q.hatena.ne.jp/1378255397
に再度質問させていただきました。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません