Cum pot evita tratarea erorilor 404 în WordPress și redirectarea acestora către 404.html pentru fișiere statice?
Cum pot evita tratarea erorilor 404 în WordPress și redirecta toate erorile 404 pentru fișiere statice către 404.html?
Am citit și se pare că nu este posibil când se folosesc permalink-uri?
Obiectivul este de a reduce încărcarea serverului pentru erorile 404 prin evitarea încărcării PHP.

.htaccess să omită gestionarea erorilor 404 în WordPress pentru fișiere statice.
<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>
Notă: Aceste reguli au fost generate de plugin-ul W3 Total Cache*
Nginx să omită gestionarea erorilor 404 în WordPress pentru fișiere statice.
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;
}

Poate o soluție simplă. Folosește tag-ul condițional is_404()
și creează o redirecționare către fișierul tău static; include codul în fișierul header.php
sau index.php
al temei.
Iată un exemplu.
if ( is_404() ) {
wp_redirect( 'static.htm' );
exit;
}
Link-uri

decizia este încă luată în PHP aici și nu la nivel de htaccess. Scopul este să sări peste încărcarea PHP cu totul pentru erorile 404.

@freethinker: corect, doar prin php; metoda prin htaccess este mai rapidă, dar poate nu atât de ușor de gestionat în WordPress

Pentru a completa ce a spus Chris_O... aș recomanda să instalezi W3 Total Cache și să folosești setările din acel plugin pentru a nu stoca în cache fișierele statice. Pluginul în sine este foarte util și obligatoriu pentru a accelera site-ul, mai ales cu ultima actualizare.
De asemenea, îți recomand să arunci o privire la Crearea unei pagini de eroare 404 de la WordPress pentru a vedea cum să gestionezi erorile 404 pentru fișiere statice, 403 (interzis), etc. Este o lectură utilă.

Nu sunt sigur că acest lucru este posibil. Dacă te uiți la codul htaccess pe care WordPress îl creează atunci când activezi permalink-urile, acesta spune practic: "Dacă fișierul/directorul nu poate fi găsit, trimite-l la index.php." Aceasta include toate cererile efective de 404. În afară de a crea o listă cu fiecare resursă publică generată dinamic pe care WordPress o cunoaște și de a o insera direct în .htaccess, va trebui să încarci php pentru a gestiona erorile 404.

Mi-a plăcut ideea lui Chris_O, dar am făcut propria mea versiune, care este mai sigură.
Ceea ce am făcut a fost să adaug foldere la excepții, astfel încât dacă cererile încep cu acele linii - nu poate fi un permalink valid. Majoritatea cererilor vin de la roboți care încearcă să verifice conținutul acestor foldere pentru exploatări. Acestea vor fi filtrate eficient, iar dacă este necesar, puteți afișa o mică pagină statică 404.
Celelalte cereri vor fi în continuare gestionate de WordPress, iar dacă cineva introduce o adresă greșită, va afișa un mesaj prietenos de „negăsit” în cadrul șablonului vostru. Soluția lui Chris_O va funcționa doar pentru cererile care arată ca extensii de fișiere, altfel vor fi și ele gestionate de WordPress.
Pentru a fi și mai sigur, puteți prelua fișierul vostru de acces brut și căuta erorile 404. Dacă observați multe cereri care încep cu anumite linii, le puteți include și pe acestea în acest filtru:
#adaugarea propriului 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>

Am instalat mai multe CMS-uri pe site-ul meu, așa că folosesc ceva de genul acesta pentru a utiliza aceeași pagină de eroare 404 pentru toate CMS-urile. Folosesc această configurație pentru Nginx+FastCgi și funcționează corect:
server {
...
error_page 404 /404.html; #activează pagina personalizată de eroare 404
location ~ /\.ht {
deny all; #dezactivează accesul la fișierele 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; #dezactivează interceptarea erorilor 404 de către PHP
}
location /wordpress/ {
try_files $uri $uri/ /wordpress/index.php?$args;
}
}
Folosesc această configurație împreună cu aceasta în php.ini:
cgi.fix_pathinfo = 1
WordPress este instalat astfel http://example.com/wordpress/. Fișierul 404.html este localizat în rădăcina http://example.com/.
P.S. Nu uitați că serviciile PHP și Nginx trebuie repornite după modificarea fișierelor php.ini sau nginx.conf pentru ca modificările să intre în vigoare.

Salut Mazhar, ai putea să postezi un răspuns complet, în loc doar un link către site-ul tău. Dacă linkul acela nu mai funcționează, acest răspuns va fi practic inutil! Mulțumesc!
