Проблема: предположим, что URL запрашивает файл, который не существует, например, mydomain.com/index.php/bogus
Папка с именем bogus не существует, поэтому я ожидаю ответа «404 not found», но вместо этого Apache отправляет запрос в /index.php (который существует). Зачем? Как я могу изменить его, чтобы ответить ‘404 not found’?
Я предполагаю, что теоретически Apache делает это, чтобы позволить мне сгенерировать пользовательскую страницу индекса для папки «фиктивная» (которая, однако, не существует). Но на практике, возвращая страницу с ответом 200, это приводит в замешательство поисковые системы и случайных посетителей. Мой PHP-код в index.php не ожидает этот URL, поэтому он генерирует неработающие ссылки в своих динамических процедурах навигации.
Я пытался отключить индексы (Option -Indexes
) и индексация каталогов (DirectoryIndex disabled
) и удалил .htaccess (AllowOverride None
). Ни один из них не изменил ответ. Я искал stackoverflow, и у него есть множество «как обслуживать файл вместо 404», но это наоборот: я хочу, чтобы Apache возвратил 404 вместо того, чтобы обслуживать файл PHP сверху в файловой системе.
Моя серверная среда — Windows Server 2008, Apache 2.2.22 и PHP 5.3. Нет mod_rewrite.
Решение, которое работает, это добавить AcceptPathInfo Off
в конфигурационный файл Apache.
Эта директива определяет, будут ли приниматься или отклоняться запросы, содержащие информацию об имени конечного пути, которая следует за фактическим именем файла (или несуществующим файлом в существующем каталоге). Конечная информация о путевом имени может быть сделана доступной для сценариев через спецификации CGI (общий интерфейс шлюза).
Основные документы Apache имеют больше информации: http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo
У вас нет папки с именем index.php, у вас есть файл с таким именем. Я думаю, Apache находит файл и решает, что он нашел то, что было запрошено, поэтому он обслуживает файл.
В вашем файле index.php вы можете проверить, что $_SERVER['REQUEST_URI']
является действительным запросом для index.php. Если это не правильный запрос, вы можете использовать PHP http_response_code(404)
или же header()
функции, чтобы ваш index.php возвращал 404 для недействительных URL.