次の .htaccess が完全に機能しています。
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC]
これにより、次のような URL を記述できるようになります。
http://www.mysite.com/peter => http://www.mysite.com/mypage.php?u=peter
しかし、既存のファイルに .php 拡張子を記述しないようにする追加のルールが必要な場合はどうすればよいでしょうか?
http://www.mysite.com/contact (contact.php exists on file)
これを現在の htaccess に追加しようとしました (ただし、機能しません):
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
つまり、同じ .htaccess でバニティ URL を使用して、.php 拡張子を無視したいと考えています。
解決しました!Ulrich Palha と Mario に感謝します (注文と LAST [L] フラグについて知りませんでした!
RewriteEngine on
# Unless directory, remove trailing slash
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([^/]+)/$ http://www.mysite.com/$1 [R=301,L]
# Redirect external .php requests to extensionless url
RewriteCond %{THE_REQUEST} ^(.+)\.php([#?][^\ ]*)?\ HTTP/
RewriteRule ^(.+)\.php$ http://www.mysite.com/$1 [R=301,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [L]
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule .* - [L]
RewriteRule ^(.*)$ http://www.mysite.com/mypage.php?u=$1 [NC]