В ваших первоначальных правилах вы просто говорите, что любая страница, которая не является файлом или каталогом, должна быть перенаправлена на одно и то же имя с добавлением .php
.
Итак, что вам нужно сделать, чтобы«удалить» доступ к файлу .php
- это замаскировать его перенаправлением.Таким образом, вы сообщаете клиентскому браузеру, что foo/foo.php
на самом деле foo/foo
.
. Это инициирует новый запрос клиента к foo/foo
.
Затем вы сообщаете серверу, чтоfoo/foo
на самом деле foo/foo.php
.Это вызовет внутренний запрос на foo/foo.php
.Итак, у вас есть петля.Мы должны избегать этого.Лучший обходной путь, который я нашел, - это проверить, где %{REDIRECT_URL}
пусто или нет.
Наконец, правила таковы:
# External redirection from real file to virtual with safe guard for internal redirection.
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REDIRECT_URL} !^$
RewriteRule ^(.*)\.php$ /$1 [QSA,R=301,L]
# Internal redirection to real file.
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ /$1.php [QSA,L]
Не забывайте, что ЛЮБОЕ перезапись / перенаправление запускает новый запрос!
См .: Как работает перезапись URL?