Vấn đề
Đây là một tình huống gây khó chịu nhưng rất phổ biến. Trang chủ WordPress của bạn tải hoàn hảo, nhưng mọi liên kết đến bài viết hoặc trang đều trả về lỗi 404 Not Found thông thường. Điều này thường xảy ra sau khi chuyển trang web, thay đổi tên miền hoặc cập nhật plugin. Trong hầu hết các trường hợp, máy chủ web đang tìm kiếm một thư mục hoặc tệp vật lý không tồn tại vì nó không biết cách xử lý "đường dẫn tĩnh" (pretty permalinks) như /blog/my-awesome-post/.
Cách khắc phục trong 60 giây
Hãy thử cách này trước. Nó giải quyết được vấn đề trong khoảng 90% trường hợp bằng cách buộc WordPress xây dựng lại các quy tắc định tuyến nội bộ.
- Đăng nhập vào bảng điều khiển quản trị WordPress của bạn.
- Đi tới Cài đặt > Đường dẫn tĩnh.
- Đừng thay đổi bất kỳ cài đặt nào. Chỉ cần cuộn xuống dưới cùng và nhấp vào Lưu thay đổi.
- Tải lại trang đang bị lỗi của bạn. Nếu nó hoạt động, các quy tắc ghi lại (rewrite rules) của bạn vừa rồi chỉ bị mất đồng bộ. Nếu không, hãy tiếp tục đọc.
Tại sao điều này lại xảy ra?
- Thiếu tệp .htaccess: Tệp điều hướng lưu lượng truy cập đến
index.phpbị thiếu hoặc bị hỏng. - Mod_Rewrite đang tắt: Máy chủ Apache của bạn chưa được bật module cần thiết để xử lý các URL tùy chỉnh.
- Cấu hình bị ghi đè: Máy chủ được thiết lập để bỏ qua các tệp
.htaccesscục bộ. - Cấu hình Nginx: Nginx không sử dụng
.htaccessvà yêu cầu một quy tắc cụ thể trong tệp cấu hình của trang web.
Khắc phục lỗi trên máy chủ Apache
1. Tạo lại tệp .htaccess thủ công
Đôi khi WordPress không có đủ quyền để ghi vào máy chủ của bạn. Nếu mẹo "Lưu thay đổi" thất bại, bạn sẽ cần thực hiện thủ công. Sử dụng FTP hoặc Trình quản lý tệp của hosting để tìm thư mục gốc của bạn. Tạo một tệp tên là .htaccess và dán mã tiêu chuẩn này vào:
# BẮT ĐẦU WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# KẾT THÚC WordPress
Đảm bảo quyền truy cập tệp được thiết lập thành 644. Điều này cho phép máy chủ đọc tệp trong khi vẫn giữ an toàn trước các chỉnh sửa trái phép.
2. Kích hoạt Rewrite Module
Nếu bạn tự quản lý VPS (như DigitalOcean hoặc Linode), rewrite module có thể đã bị tắt. Hãy chạy các lệnh sau để bật nó lên:
sudo a2enmod rewrite
sudo systemctl restart apache2
3. Cập nhật VirtualHost (AllowOverride)
Máy chủ của bạn có thể đang bỏ qua hoàn toàn tệp .htaccess. Hãy mở tệp cấu hình trang web của bạn, thường nằm tại /etc/apache2/sites-available/000-default.conf. Tìm khối <Directory> cho thư mục web của bạn và đảm bảo AllowOverride được đặt thành All:
<Directory /var/www/html>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
Lưu tệp và khởi động lại Apache để áp dụng các thay đổi.
Khắc phục lỗi trên máy chủ Nginx
Nginx không nhận diện các tệp .htaccess. Nếu các trang nội bộ của bạn trả về lỗi 404, có khả năng khối server block của bạn đang thiếu logic rewrite. Hãy mở tệp cấu hình Nginx (ví dụ: /etc/nginx/sites-available/your-site).
Tìm khối location / và đảm bảo nó bao gồm chỉ thị try_files:
location / {
try_files $uri $uri/ /index.php?$args;
}
Dòng này hướng dẫn Nginx tìm kiếm tệp hoặc thư mục trước. Nếu không tìm thấy, nó sẽ chuyển yêu cầu đến index.php. Luôn kiểm tra cấu hình trước khi khởi động lại:
sudo nginx -t
sudo systemctl reload nginx
Các trường hợp đặc biệt cần lưu ý
Sự can thiệp của Plugin bảo mật
Các plugin như iThemes Security hoặc Wordfence thường bảo vệ tệp .htaccess bằng cách đặt nó ở chế độ "chỉ đọc". Nếu bạn không thể lưu cài đặt đường dẫn tĩnh, hãy thử tạm thời hủy kích hoạt các plugin này để xem tệp có thể ghi lại được hay không.
Môi trường phát triển cục bộ (WAMP/XAMPP)
Trên các thiết lập Windows hoặc Mac cục bộ, rewrite_module thường bị tắt theo mặc định. Nhấp vào biểu tượng Apache trong bảng điều khiển XAMPP/WAMP, tìm tệp httpd.conf, tìm kiếm mod_rewrite và xóa dấu # ở đầu dòng.
Cách xác minh việc khắc phục
- Sử dụng Chế độ ẩn danh: Các trình duyệt thường lưu bộ nhớ đệm cho các phản hồi 404. Luôn kiểm tra trong cửa sổ riêng tư để đảm bảo bạn đang thấy trang web thực tế.
- Kiểm tra Header: Sử dụng
curltrong terminal của bạn để xem mã phản hồi của máy chủ:
curl -I https://yourdomain.com/sample-post/
Kết quả bạn muốn thấy là `HTTP/1.1 200 OK`.
- **Kiểm tra bằng kiểu "Cơ bản":** Đi tới **Cài đặt > Đường dẫn tĩnh** và đặt thành "Cơ bản" (Plain). Nếu các bài viết hoạt động ngay bây giờ, vấn đề chắc chắn nằm ở cấu hình rewrite của máy chủ.

