Як пропустити обробку 404 wordpress та перенаправити всі 404 помилки для статичних файлів до 404.html?
Я читав, і здається, це неможливо при використанні постійних посилань?
Мета - зменшити навантаження сервера на 404 помилки, не завантажуючи php.
Як пропустити обробку 404 wordpress та перенаправити всі 404 помилки для статичних файлів до 404.html?
Я читав, і здається, це неможливо при використанні постійних посилань?
Мета - зменшити навантаження сервера на 404 помилки, не завантажуючи php.
Відповіді:
<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 *
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;
}
Щоб продовжити те, що сказав Chris_O .... Я встановив би W3 Total Cache і використав налаштування цього плагіна, щоб не кешувати статичні файли. Плагін сам по собі дуже корисний і обов'язковий для прискорення вашого сайту, особливо з останнім оновленням.
Також я рекомендую ознайомитись зі створенням сторінки помилки 404 з Wordpress, щоб побачити, як обробляти 404 для статичних файлів, 403 (заборонено) тощо.
Можливо, просте рішення. Використовуйте умовний тег is_404()
та створіть переспрямування на ваш статичний файл; включити код у файл header.php
або index.php
тему.
Ось приклад.
if ( is_404() ) {
wp_redirect( 'static.htm' );
exit;
}
Посилання
Я не впевнений, що це можливо. Якщо ви подивитесь на код htaccess, який створює WordPress під час ввімкнення постійних посилань, він в основному говорить: "Якщо файл / каталог не вдалося знайти, надішліть його на index.php." Сюди входять усі фактичні 404 запити. Окрім створення списку кожного динамічно генерованого публічного ресурсу, про який WordPress знає, і безпосередньо вставляючи його в .htaccess, вам потрібно завантажити php для обробки 404-х.
Ідея 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>
На моєму сайті встановлено кілька 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 способи зробити це
Повний підручник - (посилання мертве та переспрямоване на спам)