У меня есть .htaccess, в настоящее время настроенный для перезаписи чего-либо без точки или сокращения до эквивалента с расширением .php (так что «foo» внутренне вытягивает «foo.php») с помощью следующего:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !(.*)\.php
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^([^/.]+)$ $1.php [L,NS]
Однако я бы хотел, чтобы прямые запросы на «foo.php» возвращались с 404, как если бы файл не существовал (как если бы кто-то пробовал «foo.asp» или «foo.blargh»). Я знаю, что есть флаги [F] и [G], но я не хочу, чтобы они были «запрещены» (403) или «ушли» (410), поскольку это результаты, отличные от того, что возвращает несуществующий файл (404).
Есть ли способ сделать это?
ОБНОВЛЕНИЕ 1
Я пробовал
RewriteCond %{REQUEST_FILENAME} \.php$
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.php\ HTTP/
RewriteRule ^(.*)$ /error.php?e=404 [R=404,L,NS]
Что работает ... пока я не попытаюсь использовать обработчик ErrorDocument. Предполагая "error.php" в корне моего документа, все что угодно по ErrorDocument 404 /error?e=404
(я также пробовал с error.php и т. Д.) Извергает ошибку
Не найдено
Запрошенный URL /foo.php не найден на этом сервере.
Кроме того, при обнаружении ошибки 500 Internal Server Error
пытается использовать ErrorDocument для обработки запроса.
... но только при попытке доступа к реально существующей странице .php (например, foo.php); любая попытка получить доступ к странице, которая на самом деле не существует (и, следовательно, не вызывает моего второго правила перезаписи), переходит на страницу, указанную обработчиком ErrorDocument.