Jak pominąć obsługę 404 wordpress i przekierować wszystkie błędy 404 dla plików statycznych do 404.html?

17

Jak pominąć obsługę 404 wordpress i przekierować wszystkie błędy 404 dla plików statycznych do 404.html?

Czytam i wydaje się, że nie jest możliwe, gdy używasz permalinków?

Celem jest zmniejszenie obciążenia serwera dla błędów 404 przez nie ładowanie php.

wolno-myśliciel
źródło

Odpowiedzi:

8

.htaccess pomiń obsługę błędów WordPress 404 dla plików statycznych .

<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>

Uwaga: te reguły zostały wygenerowane przez wtyczkę W3 Total Cache *

Nginx pomija obsługę WordPress 404 dla plików statycznych.

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
źródło
1

Aby rozszerzyć to, co powiedział Chris_O .... Zainstalowałbym W3 Total Cache i używałbym ustawień z tej wtyczki, by nie buforować plików statycznych. Wtyczka sama w sobie jest bardzo przydatna i musi przyspieszyć twoją stronę, szczególnie z najnowszą aktualizacją.

Polecam również zajrzeć do Tworzenie strony błędu 404 z Wordpress, aby zobaczyć, jak obsługiwać 404 dla plików statycznych, 403 (zabronione) itp. To dobry odczyt.

Matthew Xerri
źródło
1

Może proste rozwiązanie. Użyj tagu warunkowego is_404()i utwórz przekierowanie do pliku statycznego; dołącz kod do pliku header.phplub index.phpmotywu.

Oto przykład.

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

Spinki do mankietów

bueltge
źródło
2
proces decyzyjny nadal odbywa się w PHP, a nie na poziomie htaccess. Celem jest całkowite pominięcie ładowania PHP z powodu błędów 404.
wolnomyśliciel
2
@freethinker: racja, tylko przez php; droga przez htaccess jest szybsza, ale może nie tak łatwa w obsłudze w WordPress
bueltge
@kaiser oops, zaktualizowałem pytanie
freethinker
0

Nie jestem pewien, czy to jest możliwe. Jeśli spojrzysz na kod htaccess, który WordPress tworzy po włączeniu permalinków, w zasadzie mówi: „Jeśli nie można znaleźć pliku / katalogu, wyślij go do index.php”. Dotyczy to wszystkich rzeczywistych 404 wniosków. Poza utworzeniem listy każdego dynamicznie generowanego zasobu publicznego, o którym wie WordPress, i bezpośrednim wstawieniem tego do .htaccess, musisz załadować php, aby obsłużyć 404.

pola
źródło
0

Podobał mi się pomysł Chris_O , ale stworzyłem własną wersję, która jest bezpieczniejsza.

Więc co zrobiłem, właśnie dodałem foldery do wyjątku, więc jeśli twoje żądania zaczynają się od tych linii - to zdecydowanie nie jest prawidłowy bezpośredni link. Większość żądań pochodzi od botów, które próbują sprawdzić zawartość tych folderów pod kątem exploitów. Będą one skutecznie filtrowane, aw razie potrzeby możesz wyświetlić małą statyczną stronę 404.

Inne żądania będą nadal obsługiwane przez wordpress, a jeśli ktoś wpisze niewłaściwy adres, wyświetli przyjazną dla użytkownika wiadomość nie znalezioną w szablonie. Rozwiązanie Chris_O będzie działać tylko w przypadku żądań, które wyglądają jak rozszerzenia plików, w przeciwnym razie będą one obsługiwane przez wordpress.

Aby uczynić go jeszcze bardziej niezawodnym, możesz odzyskać plik dostępu surowego i wyszukać błędy 404. Jeśli zauważysz wiele żądań rozpoczynających się od konkretnych wierszy, możesz również dołączyć je do tego filtra:

#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>
Anonimowy
źródło
0

Mam wiele CMSów zainstalowanych na mojej stronie, więc używam czegoś takiego, aby użyć tej samej strony błędu 404 dla wszystkich CMSów. Używam tego conf dla Nginx + FastCgi i działa dobrze:

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;
    }
}

Używam tej konfiguracji razem z tym w php.ini:

cgi.fix_pathinfo = 1 

wordpress jest zainstalowany tak jak ten http://example.com/wordpress/ . plik 404.html znajduje się w katalogu głównym http://example.com/ .

PS Nie zapominaj, że usługi PHP i Nginx muszą zostać zrestartowane po wprowadzeniu zmian w plikach php.ini lub nginx.conf, aby zmiany odniosły skutek.

eliz82
źródło
-3

Można to zrobić na 3 sposoby

  1. Zmieniając kod 404.php.
  2. Korzystając z wtyczek wordpress.
  3. Poprzez edycję pliku .htaccess.

Kompletny samouczek - (martwy link i przekierowanie do spamu)

Mazhar
źródło
Cześć Mazhar, czy mógłbyś zamieścić pełną odpowiedź, a nie tylko link do swojej witryny? Jeśli ten link umrze, ta odpowiedź będzie prawie bezużyteczna! Twoje zdrowie!
Stephen Harris
ta strona daje 404. Ironiczny. A może próbujesz coś powiedzieć?
Michiel van der Blonk,