Ловушка 404 для несуществующих файлов
В этой статье я объясню, как избежать генерации страницы ошибки 404 для несуществующих файлов на вашем сайте WordPress. Это будет особенно полезно, если вы работаете с локальным сервером или если на вашем сайте есть битые ссылки на изображения.
Содержание
- Закрытие ненужных страниц 404
- Способ с использованием .htaccess (рекомендуется)
- Способ с использованием PHP (не рекомендуется)
- Внимание для уже работающих сайтов!
Закрытие ненужных страниц 404
Когда у вас на странице есть битая ссылка на файл, WordPress создает две страницы: саму страницу и страницу ошибки 404. Если на странице две битые ссылки, то создается три страницы и так далее.
На работающем сайте, как правило, битых ссылок нет, поэтому возникает меньше подобных проблем. Однако при работе на локальном сервере может быть полезно не загружать страницу 404, если ссылка ведет на файл.
Способ с использованием .htaccess (рекомендуется)
Эту проблему можно решить, добавив следующий код в файл functions.php и обновив правила перезаписи.
# Добавляем условия в .htaccess, которые будут возвращать ответ сервера 404 для несуществующих файлов.
# Обратите внимание: чтобы код заработал, необходимо обновить правила перезаписи.
if( is_admin() ){
add_filter( 'mod_rewrite_rules', 'block_nonexistent_files' );
function block_nonexistent_files( $rules ) {
$add_rules = '
# 404 для несуществующих файлов.
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/robots.txt$
RewriteCond %{REQUEST_URI} .(php|s?htm|shtml|css|js|yml|swp|txt|jpe?g|png|gif|ico|pdf)(.*)?$
RewriteRule . - [R=404,L]
';
$add_rules = trim( $add_rules );
$add_rules = preg_replace( '/^t+/m', '', $add_rules );
return "n$add_rulesnn" . $rules;
}
}
Чтобы убедиться, что всё работает, введите в браузере http://my-domain/image.jpg и проверьте ответ 404.
Что делает этот код?
Когда запрашивается файл (например, изображение с расширением .jpg, .gif, .png, .zip и т.д.), происходит проверка на физическое существование файла. Если файл не существует, скрипт завершает выполнение с кодом 404, и запрос не доходит до PHP и WordPress. Это происходит очень быстро.
Вы можете настроить шаблон страницы 404 с помощью директивы ErrorDocument 404 /404.html, создав файл 404.html в корне сайта.
Способ с использованием PHP (не рекомендуется)
Этот код следует вставить в самом начале файла index.php в корневой директории сайта, где расположен файл wp-config.php.
// Проверяем наличие ошибки 404, если это файл, не генерируем страницу,
// а просто сообщаем об ошибке
$URIreq = $_SERVER['REQUEST_URI'];
if ( preg_match('/.(jpg|jpeg|gif|png|zip)(?.+)?$/', $URIreq ) ){
$PathToFileFromRoot = $_SERVER['DOCUMENT_ROOT'].$URIreq;
$PathToFileFromRoot = str_replace( '//', '/', $PathToFileFromRoot );
if ( !file_exists($PathToFileFromRoot) ){
echo "
Файл не найден: $URIreq
Со страницы: {$_SERVER["HTTP_REFERER"]}
Перейти на сайт: http://{$_SERVER['HTTP_HOST']}
";
exit();
}
}
Внимание для уже работающих сайтов!
Такой же эффект наблюдается при наличии:
- Битых ссылок на несуществующие файлы: изображения в CSS, CSS, JS и другие файлы.
- Несуществующих файлов, к которым часто обращаются различные боты, например,
example.com/absd.php. - Удаленных изображений, которые копировались и использовались на других сайтах.
Если вы заметили, что ваша страница загружается подозрительно медленно, проверьте все ссылки на странице. Я несколько раз находил битые ссылки. Например, на сайте wordpressinside.ru я нашел как минимум две битые ссылки:
http://wordpressinside.ru/wp-content/plugins/simple-counters/js/sc.js.phphttp://wordpressinside.ru/wp-content/plugins/simple-counters/js/jquery.qtip.js
Эти ссылки встроены в шаблон, и при генерации любой страницы создаются две страницы 404 одновременно. Это существенно замедляет время генерации страницы и создает дополнительную нагрузку на сервер.
Чтобы решить данную проблему, просто удалите битые ссылки — они на самом деле не нужны!