これらのルール:
RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
内部書き換えループを引き起こしています。書き換えエンジンは、内部リダイレクトの制限に達する (その結果、500 サーバー エラーが発生する) か、エンジンから出力される結果の URI が、そこに入ったものと同じになるまで、すべてのルールをループします。さらに (これは非常に重要な概念です)、URI の先頭のスラッシュは、htaccess ファイル内のルールの書き換えエンジンに送信される前に削除されます。だからここにある:
- リクエストが行われます: http://domain.com/blah
- URI = /何とか
- 先頭のスラッシュを削除、URI =何とか
- 何とか一致
^([^/]*)$
、ルールが適用され、URI = /index.php?page=何とか
- 何とか等しくない/index.php
- ルール ループ、URI = /index.php
- 先頭のスラッシュを削除、URI = index.php
- index.phpが一致
^([^/]*)$
し、ルールが適用され、URI = /index.php?page=index.php
- インデックスが等しくない/index.php
- ルール ループ、URI = /index.php
- 先頭のスラッシュを削除、URI = index.php
- index.phpが一致
^([^/]*)$
し、ルールが適用され、URI = /index.php?page=index.php
- インデックスが等しくない/index.php
等
これに対処する方法には、いくつかの選択肢があります。/
簡単なのは、ターゲットからを単純に削除することです。
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
これにより、上記のステップ 9 で、インデックスがindex.phpと等しくなり、書き換えプロセスが停止します (2 回目に適用される前に)。これの唯一の欠点は、リダイレクトする必要がある場合、または htaccess ファイルが移動された場合、ターゲットの相対 URI が URL パスではなくファイル パスと間違えられることがあります (apache はこれを推測し、apache は時々 apache を推測します)。違う)。これは、ベースを含めることで修正できます。
RewriteBase /
RewriteRule ^([^/]*)$ index.php?page=$1 [L]
また、条件を追加して、既存のリソースを指す URL がこのルールの適用を除外するようにすることもできます。
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]
そのため、URI が既存のファイルまたはディレクトリを指している場合、ルールはスキップされます。そのため、URI が/index.phpになる最初の書き換えの後、そのファイルが存在するため、2 回目はルールがスキップされます。これにより、ドキュメント ルート内の画像、CSS、スクリプト、または静的ページのリクエストが 経由でルーティングされなくなりますindex.php
。これが望ましくない場合は、URI がすでに index.php である場合は完全にスキップすることもできます。
RewriteCond %{REQUEST_URI} !^/index.php
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]