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

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


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

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

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

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


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

●質問者: tokyosmash
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:Apache mod_rewrite PHP ファイル ルー
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

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


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

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

こんなところで。

◎質問者からの返答

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

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

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


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

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


2 ● b-wind
●27ポイント

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

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

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

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


Apache module mod_rewrite

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

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

◎質問者からの返答

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

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を返されます。単に正規表現の書き方が間違っているのだと解釈しました。

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

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


3 ● tezcello
●26ポイント

> 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 のファイル名を変えてしまえば「影響」ないのでは?

関連質問


●質問をもっと探す●



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