1

.htaccess の短くわかりやすい URLの指示に従おうとしましたが、これらの結果を達成できません。

以下を使用すると、正常に動作します。

RewriteEngine On
RewriteRule ^([^/]*)\.html$ /index.php?page=$1 [L]

ただし、次を使用する場合:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

内部サーバー エラーが発生します。

私が達成しようとしているのは、http://website.com/about.htmlの代わりにhttp://website.com/aboutを使用できるようにすることだけです

4

1 に答える 1

2

これらのルール:

RewriteEngine On
RewriteRule ^([^/]*)$ /index.php?page=$1 [L]

内部書き換えループを引き起こしています。書き換えエンジンは、内部リダイレクトの制限に達する (その結果、500 サーバー エラーが発生する) か、エンジンから出力される結果の URI が、そこに入ったものと同じになるまで、すべてのルールをループします。さらに (これは非常に重要な概念です)、URI の先頭のスラッシュは、htaccess ファイル内のルールの書き換えエンジンに送信される前に削除されます。だからここにある:

  1. リクエストが行われます: http://domain.com/blah
  2. URI = /何とか
  3. 先頭のスラッシュを削除、URI =何とか
  4. 何とか一致^([^/]*)$、ルールが適用され、URI = /index.php?page=何とか
  5. 何とか等しくない/index.php
  6. ルール ループ、URI = /index.php
  7. 先頭のスラッシュを削除、URI = index.php
  8. index.phpが一致^([^/]*)$し、ルールが適用され、URI = /index.php?page=index.php
  9. インデックスが等しくない/index.php
  10. ルール ループ、URI = /index.php
  11. 先頭のスラッシュを削除、URI = index.php
  12. index.phpが一致^([^/]*)$し、ルールが適用され、URI = /index.php?page=index.php
  13. インデックスが等しくない/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]
于 2012-10-25T07:03:37.213 に答える