Пользовательская страница ошибки 404 - только для страниц PHP - PullRequest
5 голосов
/ 09 марта 2012

У меня есть персональная страница для 404 с htaccess

ErrorDocument 404 /404.php

Работает нормально, но занимает все .jpg, .js, .css и т.д ... Я хотел бы, чтобы он просто взял .php и сделал обычную ошибку 404 для всех остальных.

Я нигде не нашел этот вариант.

Большое спасибо.

Ответы [ 3 ]

5 голосов
/ 09 марта 2012

Не уверен, но попробуйте:

<Files ~ "\.php$">
    ErrorDocument 404 /404.php
</Files>

Цитата из Директивы о файлах Документация:

Директива ограничивает область применения директивы по имени файла.

2 голосов
/ 09 марта 2012

Есть несколько возможных подходов к этому, но я бы сделал один из следующих:

Вы можете использовать mod_rewrite, как предлагает @LazyOne, для перенаправления только файлов с расширением .phpв ваш пользовательский документ:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f # Only redirect to error for files that don't exist
RewriteRule ^(.*)\.php$ /404.php [L]

Или вы можете направить все через обработчик ошибок PHP, как вы уже делаете, и использовать PHP, чтобы определить, является ли запрашиваемый ресурс сценарием PHP или нет:

<?php

  if (strtolower(substr($_SERVER['SCRIPT_URL'], -4)) != '.php') {
    // If the requested resource does not have a .php extension, include the standard error doc and exit
    include '404.html';
    exit;
  }

  // Handle .php 404s here

Недостаток этого второго подхода заключается в том, что вам может потребоваться переписать стандартный документ об ошибках, чтобы он использовал PHP для получения динамической информации для отображения пользователю, такой как и запрошенный путь к ресурсу.

1 голос
/ 09 марта 2012

Используя $_SERVER['REQUEST_URI'], вы можете легко проверить конец файла, который привел к ошибке, а затем выбросить заголовок в нормальный 404, если он не соответствует вашим потребностям, или просто отрендеритьдругой 404

Поместите это в свой файл 404.php

$bad_url = $_SERVER['REQUEST_URI'];
$bad_extension = substr(strrchr($bad_url,'.'),1);

if($bad_extension != "php"){
    //Not PHP
}else{
    //PHP
}
...