Как пропустить обработку WordPress 404 и перенаправить все ошибки 404 для статических файлов в 404.html?


17

Как пропустить обработку WordPress 404 и перенаправить все ошибки 404 для статических файлов в 404.html?

Я прочитал, и кажется, что это невозможно при использовании постоянных ссылок?

Цель состоит в том, чтобы уменьшить нагрузку на сервер для 404 ошибок, не загружая php.

Ответы:


8

.htaccess пропустить обработку ошибок WordPress 404 для статических файлов .

<IfModule mod_rewrite.c>
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_URI} !(robots\.txt|sitemap\.xml(\.gz)?)
        RewriteCond %{REQUEST_FILENAME} \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$ [NC]
        RewriteRule .* - [L]
    </IfModule>

Примечание: эти правила были сгенерированы плагином W3 Total Cache *

Nginx пропускает обработку WordPress 404 для статических файлов.

if (-f $request_filename) {
    break;
}
if (-d $request_filename) {
    break;
}
if ($request_uri ~ "(robots\.txt|sitemap\.xml(\.gz)?)") {
    break;
}
if ($request_uri ~* \.(css|js|html|htm|rtf|rtx|svg|svgz|txt|xsd|xsl|xml|asf|asx|wax|wmv|wmx|avi|bmp|class|divx|doc|docx|exe|gif|gz|gzip|ico|jpg|jpeg|jpe|mdb|mid|midi|mov|qt|mp3|m4a|mp4|m4v|mpeg|mpg|mpe|mpp|odb|odc|odf|odg|odp|ods|odt|ogg|pdf|png|pot|pps|ppt|pptx|ra|ram|swf|tar|tif|tiff|wav|wma|wri|xla|xls|xlsx|xlt|xlw|zip)$) {
    return 404;
}

1

Чтобы расширить сказанное Chris_O .... Я бы установил W3 Total Cache и использовал настройки этого плагина, чтобы не кэшировать статические файлы. Плагин сам по себе очень полезен и необходим для ускорения вашего сайта, особенно с последним обновлением.

Также я рекомендую вам взглянуть на страницу создания ошибки 404 из Wordpress, чтобы узнать, как обрабатывать 404 для статических файлов, 403 (запрещено) и т. Д. Это хорошее чтение.


1

Возможно простое решение. Используйте условный тегis_404() и создайте редирект на ваш статический файл; включите код в файл header.phpили index.phpтему.

Вот пример.

   if ( is_404() ) {
      wp_redirect( 'static.htm' );
      exit;
   }

связи


2
Принятие решений все еще осуществляется здесь на PHP, а не на уровне htaccess. Цель состоит в том, чтобы вообще пропустить загрузку PHP для 404 ошибок.
Вольнодум

2
@freethinker: верно, только через php; путь через htaccess быстрее, но, возможно, не так легко справиться в WordPress
bueltge

@kaiser упс, обновил вопрос
вольнодум

0

Я не уверен, что это возможно. Если вы посмотрите на код htaccess, который WordPress создает при включении постоянных ссылок, он в основном говорит: «Если файл / каталог не найден, отправьте его в index.php». Это включает в себя все фактические 404 запроса. Помимо создания списка всех динамически генерируемых общедоступных ресурсов, о которых знает WordPress, и прямой вставки этого в .htaccess, вам потребуется загрузить php для обработки 404-х.


0

Мне понравилась идея Chris_O , но я сделал свою версию, которая более безопасна.

Итак, что я сделал, я просто добавил папки в исключение, поэтому, если ваши запросы начинаются с этих строк - это определенно не является действительной постоянной ссылкой. Большинство запросов поступают от ботов, которые пытаются проверить содержимое этих папок на наличие эксплойтов. Они будут эффективно отфильтрованы, и при необходимости вы можете отобразить небольшую статическую страницу 404.

Другие запросы по-прежнему будут обрабатываться WordPress, и если кто-то введет неправильный адрес, он отобразит сообщение дружественного пользователя не найден в вашем шаблоне. Решение Chris_O будет работать только для запросов, которые выглядят как расширения файлов, в противном случае они также будут обрабатываться WordPress.

Чтобы сделать его еще более надежным, вы можете получить исходный файл доступа и выполнить поиск ошибок 404. Если вы заметили много запросов, начинающихся с определенных строк, вы также можете включить их в этот фильтр:

#adding your own handler
ErrorDocument 404 /404/index.html

<IfModule mod_rewrite.c>
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_URI} !^/(404|cgi-bin|wp-admin|wp-content|wp-includes)
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

0

У меня на сайте установлено несколько CMS, поэтому я использую что-то подобное, чтобы использовать одну и ту же страницу ошибки 404 для всех CMS. Я использую этот конф для Nginx + FastCgi, и он работает нормально:

server {
    ...
    error_page 404 /404.html; #enable custom 404 error page
    location ~ /\.ht {
        deny all; #disable access to htaccess
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_intercept_errors on; #disable PHP 404 error intercept
    }
    location /wordpress/ {
        try_files $uri $uri/ /wordpress/index.php?$args;
    }
}

Я использую этот конфиг вместе с этим в php.ini:

cgi.fix_pathinfo = 1 

WordPress устанавливается следующим образом http://example.com/wordpress/ . 404.html находится в корне http://example.com/ .

PS Не забывайте, что службы PHP и Nginx необходимо перезапустить после внесения изменений в файлы php.ini или nginx.conf, чтобы изменения вступили в силу.


-3

Есть 3 способа сделать это

  1. Изменяя свой код 404.php.
  2. С помощью плагинов WordPress.
  3. Отредактировав свой .htaccess файл.

Полный учебник - (ссылка не работает и перенаправлена ​​на спам)


Привет Мажар, не могли бы вы опубликовать полный ответ, а не просто ссылку на ваш сайт. Если эта ссылка умрет, этот ответ будет в значительной степени бесполезным! Ура!
Стивен Харрис

эта страница дает 404. Иронично. Или ты пытаешься что-то сказать?
Мишель ван дер Блонк
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.