Як пропустити обробку 404 wordpress та перенаправити всі 404 помилки для статичних файлів до 404.html?


17

Як пропустити обробку 404 wordpress та перенаправити всі 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.ini або nginx.conf потрібно змінити послуги PHP та Nginx, щоб зміни набрали чинності.


-3

Існує 3 способи зробити це

  1. Змінивши код 404.php.
  2. За допомогою плагінів Wordpress
  3. Редагуючи файл .htaccess.

Повний підручник - (посилання мертве та переспрямоване на спам)


Привіт, Мажаре, чи не могли б ви опублікувати повну відповідь, а не просто посилання на ваш сайт. Якщо це посилання вмирає, ця відповідь буде майже марною! Ура!
Стівен Харріс

ця сторінка дає 404. Іронічно. Або ти щось намагаєшся сказати?
Міхель ван дер Блон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.