このルールは、PHP ファイルを指すすべての URL に適用され、後者を取り除き、残りへのリダイレクトを発行します。
RewriteEngine on
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\/[^/]+\.php\ HTTP/
RewriteRule ^(.*)/[^/]+\.php$ http://%{HTTP_HOST}/$1 [R=301,L]
編集
@Ashley Briscoe:ここで少し混乱していると思います。クライアントが要求している最初の URL がhttp://www.example.com/products/products.php
. これは上記の規則により に書き換えられhttp://www.example.com/products/
ます。
現在、書き換えられた URL はファイル リソースではなくディレクトリ (末尾のスラッシュがそれを示します) を指しているため、mod_dirが使用されている場合 (たとえば、index.html または index.php)、Apache はディレクトリ インデックス ファイル(たとえば、index.html または index.php)を提供しようとしています (であると安全に想定できます)。
ここ403 Forbidden
で得られる応答は、Web サーバーを実行しているユーザーに、ディレクトリ インデックス ファイルを読み取ったり、ディレクトリ インデックス ファイルを含むフォルダーを開いたりするための十分な権限がないことを示しています。
これを解決するには、ディレクトリ インデックス ファイルが実際に存在すること (したがって、製品ディレクトリ内に名前products.php
を変更することindex.php
) と、Web サーバーにそのファイルを読み取る権限があることを確認する必要があります。
EDIT 2
最後のコメントについて: 名前の変更がオプションでない場合は、代わりに提供するファイルを Apache に知らせる必要があります。したがって、次のように別のルールを追加します。
RewriteEngine on
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\/[^/]+\.php\ HTTP/
RewriteRule ^(.*)/[^/]+\.php$ http://%{HTTP_HOST}/$1 [R=301,L]
RewriteRule ^products/?$ /products/products.php [L]