"Спуфинг" ошибка 404 не найдена с .htaccess - PullRequest
2 голосов
/ 03 октября 2011

У меня есть .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.

1 Ответ

5 голосов
/ 04 октября 2011

Нашли решение:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ (/.*)\.php
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_URI} !^/error\.php
RewriteRule . - [R=404,L,NS]

ErrorDocument 404 /error.php?e=404

В частности, третий RewriteCond не позволяет запросам на странице ошибок инициировать RewriteRule (поскольку THE_REQUEST по-прежнему содержит исходный запрос (соответствует первому RewriteCond), а страница ошибки действительно существует (соответствует второму RewriteCond).

Обратите внимание, что третий RewriteCond соответствует формату URI, указанному для ErrorDocument. В файле error.php я использую $_SERVER["REDIRECT_SCRIPT_URL"], чтобы узнать, какой файл изначально запрашивал пользователь (таким образом, создавая впечатление, что 404 служил прямым ответом на его запрос).

...