mod_rewriteで使う正規表現について(Apache PHP)



RewriteRule ^entry(.*)\.php$ entry.php?ID=$1 [L]

これでルーティングしています。ただ、困ったことに一部変な挙動してます。

2つ相談に乗ってください。
1)^とはどのような意味を持つのでしょうか?

2)上記ルーティングがどうやらmodel_entry.phpというファイルに影響を与えているようです。このファイルに影響を与えないようにするにはどのように正規表現を書き換えればいいでしょうか?


みなさんよろしくお願い致します。

回答の条件
  • 1人10回まで
  • 登録:2007/06/11 03:43:30
  • 終了:2007/06/18 03:45:03

回答(3件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/06/11 07:44:18

ポイント27pt

1.文字列(この場合URL)の先頭。


2.やりかたは色々あるけど、

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^entry(.*)\.php$ entry.php?ID=$1 [L]

こんなところで。

id:tokyosmash

回答ありがとうございます。

つまり、「RewriteCond %{REQUEST_FILENAME} !-f」を追加するという事ですね。

実はこちらは既に.htaccess内に記述されていました。


RewriteRule ^/entry(.*)\.php$ entry.php?ID=$1 [L]

entryの前に/を追加してこれで問題無いと思ったのですがおかしくなってしまいます。ハイフンをmod_rewriteに書くといつもおかしくなるのですが何故なのでしょうか?メタ文字では無いですし、ちょっとよくわかりません。

2007/06/11 08:14:16
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/06/11 21:50:49

ポイント27pt

おかしくなってしまいます。

どうおかしくなったか分からないので説明しにくいですが、

基本的には単に設定ミスです。

mod_rewrite はプロでも間違えるほどにややこしいですから。


Apache module mod_rewrite

ある程度は理解されているようですから、ログを取ってみた方が解決が早いかもしれません。

ログレベルを上げると、mod_rewrite がどのように解釈して動いているかが良く分かります。

id:tokyosmash

ご丁寧にありがとうございます。

entry5.php をentry.php?ID=5 にルーティングするには

RewriteRule ^entry(.*).php$ entry.php?ID=$1 [L]

これで正常に動いています。しかしmodel_entry.phpというファイルにも影響を与えてしまいます。そこで、

RewriteRule ^/entry(.*).php$ entry.php?ID=$1 [L]

このようにスラッシュを入れると途端に404になってしまいます。前回のコメントでハイフンと書いたのはこのスラッシュの間違いでした。

rewriteログを取ってみたところ、正常にルーティングされている場合に表示される以下のlogが存在しません。

localhost - - ~~省略~~~ pattern='!-d' => matched

localhost - - ~~省略~~~ pattern='!-f' => matched

entry5.phpにアクセスすると、ルーティングせずにそのファイルにpass throughしています。当然ファイルが存在しないので404を返されます。単に正規表現の書き方が間違っているのだと解釈しました。

スラッシュが入ると動作しない事があるのでしょうか?検索してもヒットしないので困っています。

/  \/  \\ など色々と試しているのですがうまくいきません。

2007/06/12 05:03:22
id:tezcello No.3

tezcello回答回数460ベストアンサー獲得回数692007/06/15 09:06:18

ポイント26pt

> RewriteRule ^entry(.*).php$ entry.php?ID=$1 [L]

> これで正常に動いています。しかしmodel_entry.phpというファイルにも影響を与えてしまいます。そこで、

具体的にどのような影響が出るのでしょうか?

> localhost - - ~~省略~~~ pattern='!-f' => matched

というログが出ているのなら、ファイルが存在しない時にしかその直後のルールは適用されないはずなんですが。

条件やルールの内容と書く順序も影響するので、rewrite に関する記述は全部を記載された方が的確な回答が得られ易いと思います。


> RewriteRule ^/entry(.*).php$ entry.php?ID=$1 [L]

> このようにスラッシュを入れると途端に404になってしまいます。前回のコメントでハイフンと

^ がURLの絶対的な先頭か、相対的(.htaccessのあるディレクトリからの)先頭のどちらを意味するのかはわかりませんが、

/hoge.com/fuga/entry5.php でアクセスしているでしょうから先頭は /entry5.php ではなく、

相対的であるなら、/entry5.php ではなく entry5.php がRewriteEngine に渡される文字列でしょうから当然マッチしませんよね。


前述の「影響」がどのようなものかは分りませんが、根本解決ではないですけど、model_entry.php のファイル名を変えてしまえば「影響」ないのでは?

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

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

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

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

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