Làm cách nào để bỏ qua việc xử lý 404 của wordpress và chuyển hướng tất cả các lỗi 404 cho các tệp tĩnh sang 404.html?


17

Làm cách nào để bỏ qua việc xử lý 404 của wordpress và chuyển hướng tất cả các lỗi 404 cho các tệp tĩnh sang 404.html?

Tôi đọc và dường như không thể khi sử dụng permalinks?

Mục tiêu là giảm tải máy chủ cho lỗi 404 bằng cách không tải php.

Câu trả lời:


8

.htaccess bỏ qua xử lý lỗi WordPress 404 cho các tệp tĩnh .

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

Lưu ý: Các quy tắc này được tạo bởi plugin W3 Total Cache *

Nginx bỏ qua xử lý WordPress 404 cho các tệp tĩnh.

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

Để mở rộng những gì Chris_O đã nói .... Tôi sẽ cài đặt W3 Total Cache và sử dụng các cài đặt từ plugin đó để không lưu các tệp tĩnh. Bản thân plugin rất hữu ích và phải tăng tốc trang web của bạn, đặc biệt là với bản cập nhật mới nhất.

Ngoài ra, tôi khuyên bạn nên xem Tạo trang 404 Lỗi từ Wordpress để xem cách xử lý 404 cho các tệp tĩnh, 403 (bị cấm), v.v ... Đây là một cách đọc tốt.


1

Có lẽ là một giải pháp đơn giản. Sử dụng thẻ có điều kiện is_404()và tạo chuyển hướng đến tệp tĩnh của bạn; bao gồm mã trong tệp header.phphoặc index.phpcủa chủ đề.

Đây là một ví dụ.

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

Liên kết


2
việc ra quyết định vẫn được thực hiện trong PHP ở đây chứ không phải ở cấp htaccess. Mục đích là bỏ qua việc tải PHP hoàn toàn cho các lỗi 404.
freethinker

2
@freethinker: đúng, chỉ qua php; cách thông qua htaccess nhanh hơn, nhưng có lẽ không dễ xử lý trong WordPress
bueltge

@kaiser oops, đã cập nhật câu hỏi
freethinker

0

Tôi không chắc chắn rằng điều này là có thể. Nếu bạn nhìn vào mã htaccess mà WordPress tạo ra khi bạn bật permalinks, về cơ bản nó sẽ nói: "Nếu không thể tìm thấy tệp / thư mục, hãy gửi nó đến index.php." Điều này bao gồm tất cả các yêu cầu 404 thực tế. Ngoài việc tạo danh sách mọi tài nguyên công cộng được tạo động mà WordPress biết và trực tiếp chèn tài nguyên này vào .htaccess, bạn sẽ cần tải php để xử lý 404.


0

Tôi thích ý tưởng của Chris_O , nhưng tôi đã tạo ra phiên bản của riêng mình, an toàn hơn.

Vì vậy, những gì tôi đã làm, tôi chỉ thêm các thư mục vào ngoại lệ, vì vậy nếu các yêu cầu của bạn bắt đầu từ các dòng đó - đó chắc chắn không phải là một permalink hợp lệ. Phần lớn các yêu cầu đến từ các bot đang cố kiểm tra nội dung của các thư mục đó để khai thác. Chúng sẽ được lọc hiệu quả và nếu cần, bạn có thể hiển thị một số trang 404 tĩnh nhỏ.

Các yêu cầu khác sẽ vẫn được xử lý bằng wordpress và nếu ai đó nhập sai địa chỉ, nó sẽ hiển thị thông báo không tìm thấy thân thiện với người dùng trong mẫu của bạn. Giải pháp của Chris_O sẽ chỉ hoạt động đối với các yêu cầu trông giống như phần mở rộng tệp, nếu không, chúng cũng sẽ được xử lý bằng wordpress.

Để làm cho nó đáng tin cậy hơn nữa, bạn có thể truy xuất tệp truy cập thô của mình và tìm kiếm các lỗi 404. Nếu bạn nhận thấy nhiều yêu cầu bắt đầu bằng các dòng cụ thể, bạn cũng có thể đưa chúng vào bộ lọc này:

#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

Tôi đã cài đặt nhiều CMS trên trang web của mình vì vậy tôi sử dụng một cái gì đó như thế này để sử dụng cùng một trang lỗi 404 cho tất cả các CMS. Tôi sử dụng conf này cho Nginx + FastCgi và nó hoạt động tốt:

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

Tôi sử dụng cấu hình này cùng với cái này trong php.ini:

cgi.fix_pathinfo = 1 

wordpress được cài đặt như thế này http://example.com/wordpress/ . 404.html nằm trong thư mục gốc của http://example.com/ .

PS Đừng quên rằng các dịch vụ PHP và Nginx cần được khởi động lại sau khi thay đổi tệp php.ini hoặc nginx.conf để các thay đổi có hiệu lực.


-3

Có 3 cách để làm điều này

  1. Bằng cách thay đổi mã 404.php của bạn.
  2. Bằng cách sử dụng plugin wordpress.
  3. Bằng cách chỉnh sửa tệp .htaccess của bạn.

Hướng dẫn hoàn chỉnh - (liên kết chết và chuyển hướng đến thư rác)


Xin chào Mazhar, bạn có thể đăng một câu trả lời đầy đủ, thay vì chỉ là một liên kết đến trang web của bạn. Nếu liên kết đó chết, câu trả lời này sẽ khá vô dụng! Chúc mừng!
Stephen Harris

trang này cung cấp 404. mỉa mai. Hay bạn đang cố nói điều gì đó?
Michiel van der Blonk
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.