ルールセットはループに陥ります。どれどれ:
要求は、ブラウザに表示するために にhttp://localhost/Test/TestScript.php
リダイレクトされhttp://localhost/Test/TestScript/
、最終的に元のリソースにマップし直そうとしています。
多くの人が考えているように、ルールの[L] フラグはプロセスを停止しません。書き換えエンジンは、完全なルール セットをルールごとにループし、特定のルールが一致すると、対応する条件があればループします。このプロセスはリクエストごとに繰り返され、ルールによって新しいリクエストが生成されるため、無限ループに陥りやすくなります。
それが、この場合の「ページが適切にリダイレクトされていません」というメッセージの意味です。
このプロセスの技術的な詳細は次のとおりです。
いくつかの解決策:
I)最善かつより実用的な方法は、最初のリクエストで「きれいな」URL を直接使用し、サイレントにリソースにマッピングすることです。これは、ブラウザのアドレス バーに常に「きれいな」URL が表示されるワンステップ プロセスです。このオプションの利点の 1 つは、着信 URL の URI パスに何も存在する必要がないことです。
- リクエスト:
http://localhost/Test/TestScript/
- 内部的にリソースにマッピング:
http://localhost/Test/TestScript.php
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
# Prevent loops
RewriteCond %{REQUEST_URI} !\.php [NC]
# Map internally to the resource, showing the "pretty" URL in the address bar
RewriteRule ^([^/]+)/([^/]+)/? /$1/$2.php [L,NC]
II)リソースを直接指すリンクが既に存在するためにそれが不可能な場合、「きれいな」URL を表示しながら元の要求からデータを取得する 1 つの方法は、最初に目に見える永続的なリダイレクトを作成し、拡張機能を削除することです。 「きれいな」URL を表示してから、元のリソースに内部的に書き換えます。
- リクエスト:
http://localhost/Test/TestScript.php
、
- 恒久的かつ目に見えるリダイレクト:
http://localhost/Test/TestScript/
「きれいな」URL、
- への内部およびサイレント マッピング:
http://localhost/Test/TestScript.php
、元の要求。
Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
# Get the URI-path directly from THE_REQUEST variable
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\s/([^/]+)/([^.]+)\.php [NC]
# Strip the extension and redirect permanently
RewriteRule .* /%2/%3/ [R=301,L,NC]
# Now the browser bar shows `http://localhost/Test/TestScript/`
# Prevent loops
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !\.php [NC]
# Map internally to the original resource
RewriteRule ^([^/]+)/([^/]+)/? /$1/$2.php [L,NC]
ノート:
- 上記のオプションは、ルート ディレクトリの 1 つの .htaccess ファイルに配置され、
mod_rewrite
有効になっていることを確認します。
- 文字列TestおよびTestScriptは動的であると見なされ、任意の名前に置き換えることができます。
- ホスト名localhostは一例であり、他の名前に置き換えることもできます。