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.
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:
<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 *
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;
}
Để 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.
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.php
hoặc index.php
của chủ đề.
Đây là một ví dụ.
if ( is_404() ) {
wp_redirect( 'static.htm' );
exit;
}
Liên kết
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.
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>
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.
Có 3 cách để làm điều này
Hướng dẫn hoàn chỉnh - (liên kết chết và chuyển hướng đến thư rác)