人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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されてしまいます。
どうすればこれを回避することができるでしょうか?

●質問者: naonaosnf
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● tezcello
ベストアンサー

> 指定していないディレクトリ参照のアクセスの場合に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]

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


naonaosnfさんのコメント
回答ありがとうございます。 設定の仕方が悪いのか、?.jp/にアクセスすると ?.jp/index.php/index.php/index.php/index.php/index.php/index.php/・・・・ となってうまく表示されませんでした。。。 RewriteRuleとして?.jp/bbb/def.phpの場合は/prg/def.phpというのもあわせてしたいのですが。。 ”「存在しないファイルやディレクトリへのアクセス」の場合 rewrite する” でもOKなのですが、現状では存在しているディレクトリも無視して飛ばすようにしようかと思ったもので。。(設定が完了後にディレクトリ削除) 最終的には削除するので、「存在しないディレクトリ」でも判定方法は構いません あと、ルートにファイルやディレクトリは増える予定は(一応)ありません。

tezcelloさんのコメント
> ?.jp/にアクセスすると > ?.jp/index.php/index.php/index.php/index.php/index.php/index.php/・・・・ 提案したものでそうなるとは思えないのですが... 一応手元の XAMPP1.7.7 ではそうはなりません。 どこかに、URLをキャプチャして、URLに付加するようなルールを書いていませんか? > ?.jp/bbb/def.phpの場合は/prg/def.phpというのもあわせてしたい 見落としていました。 本体の書換ルールの前に個別で追加すればよいでしょう。 RewriteRule ^bbb/def\.php$ prg/def.php [L,QSA] あるいは、全てのディレクトリの def.php は全て prg/def.php へ書き換えるなら RewriteRule ^.+/def\.php$ prg/def.php [L,QSA] > 存在しているディレクトリも無視して飛ばすようにしようかと思ったもので。。(設定が完了後にディレクトリ削除) それも同様に個別で追加すればよいでしょう。 RewriteRule ^exists_dir/.*$ prg/index.php [L,QSA] 完了後はその行を削除(再設定があるならコメントアウト)すればよいでしょう。

naonaosnfさんのコメント
どうも色々いじってた時のキャッシュが反応していたようです。すみません。 DirectoryIndex index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.+/def\.php$ prg/def.php [L,QSA] RewriteRule ^.*$ prg/index.php [L,QSA] とした際に、400エラーとなってしまいました。(複数のブラウザで同様) そこで DirectoryIndex index.php RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.+\/def\.php$ /prg/def.php [L,QSA] RewriteRule ^.*$ /prg/index.php [L,QSA] と変更したところ、表示はされたのですが、今度はすべてが転送になってしまいました。 (存在するファイル、ディレクトリを指定しても、ドメイン直下アクセスしても転送) 何か環境が悪いとかあるんでしょうか。。。

tezcelloさんのコメント
書き方が中途半端でした。省略しないで書いた方が良かったですね。 DirectoryIndex index.php RewriteEngine on RewriteRule ^.*/def\.php$ prg/def.php [L,QSA] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^.*$ prg/index.php [L,QSA] RewriteCond で指定した条件は直後の RewriteRule でしか有効ではありません。(どこで読んだかソースを失念してしまいました...) 「全てが転送される」のはそのせいでしょう。 また、当方の環境では、400エラーにはなりませんでした。 実際にどんな書き換えが行われているか、rewrite のログを取ってみると状況が分かるかもしれません。(Apache のバージョンで指定方法が違うので公式マニュアルをご参考ください)

naonaosnfさんのコメント
いろいろありがとうございます。 > rewrite のログを取ってみると状況が分かるかもしれません まずはログを取って確認してみようと思います。 (来週になってしまいますが。。) ログ取得し、設定が確認できましたら報告いたします。

naonaosnfさんのコメント
rewriteによるログの取得ができましたのでご報告いたします。 ログを確認したところ、 RewriteCond: input='/index.php' pattern='!-f' => matched というように存在するファイルにもかかわらず、matchedとなっており、RewriteRuleが反応しているようです。 ちなみにRewriteCondでディレクトリを指定してそのディレクトリ内ファイルを参照した場合(RewriteCond %{REQUEST_URI} !/?aaa/?)は RewriteCond: input='/aaa/aaa.php' pattern='!/?aaa/?' => not-matched となり、RewriteRule対象外となっています。 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d の使用には何か制限・設定があるのでしょうか?

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に対しては適用されないというくらいだと思います。

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になっております。

質問者から

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


関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ