Apache с PHP обслуживает базовый файл вместо 404

Проблема: предположим, что 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.

0

Решение

Решение, которое работает, это добавить AcceptPathInfo Off в конфигурационный файл Apache.
Эта директива определяет, будут ли приниматься или отклоняться запросы, содержащие информацию об имени конечного пути, которая следует за фактическим именем файла (или несуществующим файлом в существующем каталоге). Конечная информация о путевом имени может быть сделана доступной для сценариев через спецификации CGI (общий интерфейс шлюза).

  • Когда AcceptPathInfo имеет значение «Выкл.», Синтаксический анализ CGI будет сохранять URL-адрес одной длинной строкой и искать файл в вашей файловой системе для сопоставления.
  • Когда AcceptPathInfo имеет значение «Вкл.», CGI разделяет URL-адрес на имя сценария, а также следующие символы — информация, предоставляемая сценарию.

Основные документы Apache имеют больше информации: http://httpd.apache.org/docs/2.0/mod/core.html#acceptpathinfo

1

Другие решения

У вас нет папки с именем index.php, у вас есть файл с таким именем. Я думаю, Apache находит файл и решает, что он нашел то, что было запрошено, поэтому он обслуживает файл.

В вашем файле index.php вы можете проверить, что $_SERVER['REQUEST_URI'] является действительным запросом для index.php. Если это не правильный запрос, вы можете использовать PHP http_response_code(404) или же header() функции, чтобы ваш index.php возвращал 404 для недействительных URL.

0

По вопросам рекламы [email protected]