0

PHPでMVCフレームワークを構築しています。私は次のようにセグメント化された URL を使用しています。

http://mydomain.com/controller/method/param1/param2

Apache .htaccess で次の書き換えルールを使用しています。

Options +FollowSymLinks
RewriteEngine on
RewriteRule ^([a-zA-Z\-_]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9]*)?/?([a-zA-Z0-9]*)?/?$ index.php?controller=$1&method=$2&param1=$3&param2=$4 [NC,L]

URL は正常に機能し、正しいコントローラーとメソッドが呼び出されています。ただし、apache2 error.log に多くのエラーが記録されています。2 つ以上のセグメントを含む URL にアクセスすると、「ファイルが見つかりません」というエラーが表示されます。ブラウザで発生する 404 はありません。

明確にするために、次の URL では Apache ログにエラーは発生しません。

http://dev.bonesphp.com/about

ただし、次の URL ではエラーが発生します。

http://dev.bonesphp.com/about/test/pre >

ファイルが存在しません: /var/www/vhosts/dev.bonesphp.com/about

php.ini エラー設定が E_ALL / STRICT に設定されています

これを修正する方法を知っている人はいますか?

前もって感謝します!

更新: 2013 年 5 月 12 日

Apache で書き換えログを有効にしました。これは、上記の URL にアクセスしようとすると、書き換えログに次のように表示されます。

127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パス情報ポストフィックスを追加: /var/www/vhosts/dev.bonesphp.com/about -> /var/www/vhosts/dev.bonesphp.com/about/test 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] ディレクトリごとの接頭辞を取り除きます: /var/www/vhosts/dev.bonesphp.com/about/test -> about/test 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パターン '^([a-zA-Z\-_]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9] の適用*)?/?([a-zA-Z0-9]*)?/?$' to uri 'about/test' 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (2) [perdir /var/www/vhosts /dev.bonesphp.com/] 'about/test' を書き換え -> 'index.php?controller=about&method=test¶m1=¶m2=' 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (3) 分割 uri=index.php?controller =about&method=test¶m1=¶m2= -> uri=index.php, args=controller=about&method=test¶m1=¶m2= 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] ディレクトリごとのプレフィックスを追加: index.php -> /var/www/vhosts/dev.bonesphp.com/index.php 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (2) [perdir /var/www/vhosts /dev.bonesphp.com/] document_root プレフィックスを取り除きます: /var/www/vhosts/dev.bonesphp.com/index.php -> /index.php 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747170a0/initial] (1) [perdir /var/www/vhosts /dev.bonesphp.com/] /index.php による内部リダイレクト [INTERNAL REDIRECT] 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a3508/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] ディレクトリごとの接頭辞を取り除きます: /var/www/vhosts/dev.bonesphp.com/index.php -> index.php 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a3508/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] パターン '^([a-zA-Z\-_]*)/?([a-zA-Z]*)?/?([a-zA- Z0-9]*)?/?([a-zA-Z0-9]*)?/?$' から uri'index.php' 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a3508/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] ディレクトリごとの接頭辞を取り除きます: /var/www/vhosts/dev.bonesphp.com/index.php -> index.php 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a3508/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] パターン '(^|/)\.' を適用しています。URI「index.php」へ 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a3508/initial/redir#1] (1) [perdir /var /www/vhosts/dev.bonesphp.com/] パススルー /var/www/vhosts/dev.bonesphp.com/index.php 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パス情報ポストフィックスを追加: /var/www/vhosts/dev.bonesphp.com/about -> /var/www/vhosts/dev.bonesphp.com/about/favicon.ico 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] ディレクトリごとの接頭辞を取り除きます: /var/www/vhosts/dev.bonesphp.com/about/favicon.ico -> about/favicon.ico 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パターン '^([a-zA-Z\-_]*)/?([a-zA-Z]*)?/?([a-zA-Z0-9] の適用*)?/?([a-zA-Z0-9]*)?/?$' to uri'about/favicon.ico' 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パス情報ポストフィックスを追加: /var/www/vhosts/dev.bonesphp.com/about -> /var/www/vhosts/dev.bonesphp.com/about/favicon.ico 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] ディレクトリごとの接頭辞を取り除きます: /var/www/vhosts/dev.bonesphp.com/about/favicon.ico -> about/favicon.ico 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (3) [perdir /var/www/vhosts /dev.bonesphp.com/] パターン '(^|/)\.' を適用しています。「about/favicon.ico」をウリに 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b747130a0/initial] (1) [perdir /var/www/vhosts /dev.bonesphp.com/] /var/www/vhosts/dev.bonesphp.com/about を通過します 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a1290/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] ディレクトリごとのプレフィックスを削除: /var/www/vhosts/dev.bonesphp.com/404.html -> 404.html 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a1290/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] パターン '^([a-zA-Z\-_]*)/?([a-zA-Z]*)?/?([a-zA- Z0-9]*)?/?([a-zA-Z0-9]*)?/?$' から uri'404.html' 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a1290/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] ディレクトリごとのプレフィックスを削除: /var/www/vhosts/dev.bonesphp.com/404.html -> 404.html 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a1290/initial/redir#1] (3) [perdir /var /www/vhosts/dev.bonesphp.com/] パターン '(^|/)\.' を適用しています。uri「404.html」へ 127.0.0.1 - - [12/May/2013:17:52:35 --0400] [dev.bonesphp.com/sid#7f0b748dc0a8][rid#7f0b6e4a1290/initial/redir#1] (1) [perdir /var /www/vhosts/dev.bonesphp.com/] パススルー /var/www/vhosts/dev.bonesphp.com/404.html
4

1 に答える 1

1

私はついにこれを解決しました!「ファイルが存在しません」というエラーは、favicon.ico に対するブラウザー リクエストが原因でした。

URL にhttp://dev.bonesphp.com /aboutなどのセグメントが 1 つしかない場合、ブラウザーは Web サイトのルート ディレクトリからファビコンを要求します。これはまさに私のファビコンがある場所です。ただし、URL にhttp://dev.bonesphp.com /about/testのように 2 つのセグメントがある場合、ブラウザーはサブディレクトリからそれを要求します。上記の URL の場合、http://dev.bonesphp.com/aboutで favicon を探します。「about」というディレクトリがないため、これは 404 になります (「/about」は About.php というコントローラ ファイルにマップされます)。

Google で検索した後、任意のディレクトリから要求されたファビコンに対して機能する Apache 書き換えルールを見つけました。

http://perishablepress.com/redirect-all-requests-for-a-nonexistent-file-to-the-actual-file/

なんとぴあ!これが終わってとてもうれしいです!

于 2013-05-12T23:44:57.463 に答える