Вы смотрите на вещи задом наперед: первое правило, которое у вас есть, не «удаляет расширение php», оно добавляет его к URL-адресам, у которых его еще нет (технически, к любомуне содержит точку).
Я думаю, вы хотите что-то более похожее на это:
RewriteEngine On
RewriteBase /
# Remove .php from any URLs that contain it, using an external 301 redirect
RewriteCond %{QUERY_STRING} !^no-redirect-loop(&|$)
RewriteRule ^(.*)\.php$ $1 [NS,R=301,L]
# Now add it back internally
RewriteCond %{QUERY_STRING} !^no-redirect-loop(&|$)
RewriteRule ^(.*)$ $1.php?no-redirect-loop [NS,QSA]
Редактировать: Во время отладки другой аналогичный ответ Я понял, что предыдущее решение, которое я разместил здесь, не будет работать в файле .htaccess.Я отредактировал приведенный выше пример кода, чтобы вместо него использовать довольно уродливый ключ для прерывания циклов перенаправления.Побочным эффектом kluge является то, что все сценарии увидят дополнительный пустой параметр URL с именем no-redirect-loop
.