Bỏ qua tới nội dung
Máy chủ & .htaccess

File .htaccess mặc định của WordPress: mã và cách khôi phục

Mã .htaccess mặc định chính xác WordPress ghi cho permalink, tác dụng từng dòng và cách khôi phục file khi bài viết bị 404 nhưng trang chủ vẫn tải được.

Đã đăng

File .htaccess mặc định của WordPress là khối RewriteEngine ngắn mà phần mềm ghi vào file .htaccess ở thư mục gốc trang web của bạn, để permalink như /2026/10/ten-bai-viet/ hoạt động thay vì trả về 404. Nó có dạng như sau:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Các quy tắc này lấy từ đoạn mã WordPress dùng để tạo khối, và chúng khớp với hướng dẫn .htaccess của chính WordPress. WordPress cũng ghi ba dòng chú thích ngay sau # BEGIN WordPress, cảnh báo rằng các chỉnh sửa giữa hai dấu đánh dấu sẽ bị ghi đè. Chúng không làm thay đổi cách các quy tắc hoạt động.

Khi cài trong thư mục con, WordPress đặt đường dẫn thư mục con vào cả RewriteBase lẫn quy tắc cuối, ví dụ RewriteBase /blog/ và RewriteRule . /blog/index.php [L]. Mạng multisite dùng một khối khác, và WordPress không tự động ghi file này cho chúng.

Điểm chính

  • WordPress tạo khối này trên Apache và LiteSpeed khi có quyền ghi và permalink đẹp đang bật. Chỉ cần mở Cài đặt > Đường dẫn tĩnh là đủ.
  • Nếu file bị thiếu hoặc hỏng, permalink trả về 404 trong khi trang chủ vẫn tải được, vì trang chủ không cần quy tắc rewrite.
  • Hãy đặt mọi thứ bạn hoặc plugin thêm vào phía trên # BEGIN WordPress, không bao giờ đặt bên trong các dấu đánh dấu. WordPress thay thế mọi thứ giữa chúng khi cập nhật file.
Kết quả terminal từ Apache: không có file .htaccess thì trang chủ trả về 200 và URL bài viết trả về 404; có khối mặc định thì cả hai đều trả về 200
Phản hồi thật từ Apache 2.4.58. Không có file, trang chủ vẫn tải được còn URL bài viết trả về 404. Có khối mặc định, cả hai đều trả về 200. Một file index.php thử nghiệm một dòng đã thay cho WordPress.

Mỗi dòng làm gì

RewriteEngine On bật module mod_rewrite của Apache cho thư mục này; không có nó, các quy tắc rewrite bên dưới không làm gì cả.

RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] giữ nguyên URL (đó là ý nghĩa của -) và sao chép header Authorization của yêu cầu vào một biến server. WordPress đọc biến đó để lấy tên người dùng và mật khẩu gửi trong header, chẳng hạn một mật khẩu ứng dụng.

RewriteBase / đặt tiền tố đường dẫn mà Apache dùng cho các URL được rewrite. WordPress đặt nó theo vị trí của trang web, nên bản cài trong thư mục con sẽ có RewriteBase /blog/.

RewriteRule ^index\.php$ - [L] là một lớp bảo vệ: nếu yêu cầu đã là index.php, việc rewrite dừng lại và yêu cầu đi qua không đổi.

Hai dòng RewriteCond là logic thực sự. %{REQUEST_FILENAME} !-f và !-d hỏi: “yêu cầu này KHÔNG khớp với một file thật, và KHÔNG khớp với một thư mục thật phải không?” Cả hai phải đúng thì quy tắc cuối mới chạy, nên một hình ảnh, file CSS hay PDF đã tải lên được phục vụ trực tiếp và không đi qua định tuyến của WordPress.

RewriteRule . /index.php [L] là thứ làm permalink hoạt động. Mọi thứ vượt qua hai điều kiện đó được gửi tới index.php, và WordPress quyết định URL đó là bài viết, trang hay trang lưu trữ nào.

Khi nào WordPress tạo lại file này, và khi nào không

WordPress làm mới quy tắc rewrite mỗi khi màn hình Cài đặt > Đường dẫn tĩnh tải, nên chỉ cần mở nó là đủ và bạn không cần nhấn Lưu thay đổi. Nếu thiếu .htaccess, WordPress sẽ tạo file miễn là thư mục có quyền ghi và permalink đẹp đang bật. Nếu file đã có và có quyền ghi, WordPress thay thế khối giữa các dấu đánh dấu.

Cách đó không khắc phục được vấn đề trong các trường hợp sau:

  • File hoặc thư mục của nó không có quyền ghi với người dùng chạy PHP. Màn hình hiện lỗi cho biết file .htaccess không có quyền ghi, kèm các quy tắc để dán. Trên một số hosting, PHP chạy dưới một người dùng hệ thống khác với người sở hữu file tải lên qua FTP, nên quyền trông có vẻ ổn trong chương trình FTP vẫn có thể chặn WordPress.
  • Bạn dùng nginx. Hướng dẫn nginx của WordPress cho biết nginx không có file cấu hình cấp thư mục như .htaccess, và WordPress không thể thay đổi cấu hình server. Định tuyến tương đương là chỉ thị try_files trong cấu hình server, và quản trị viên phải tự sửa.
  • AllowOverride được đặt là None cho thư mục trang web trong cấu hình chính của Apache. Tài liệu của Apache viết: “This means .htaccess files are completely ignored unless you explicitly enable them for a directory.” (Nghĩa là file .htaccess bị bỏ qua hoàn toàn trừ khi bạn bật chúng một cách rõ ràng cho một thư mục.) WordPress có thể ghi một file hoàn hảo mà nó vẫn không có tác dụng. Quy tắc rewrite cần AllowOverride FileInfo (hoặc All), và nhà cung cấp hosting có thể phải đổi giúp bạn.
  • Permalink của bạn đang đặt là Mặc định (Plain). URL dạng Plain không cần quy tắc rewrite, nên WordPress không tạo file cho chúng.

Cách khôi phục bằng tay

Nếu bài viết và trang bị 404 trong khi trang chủ vẫn chạy, hãy kiểm tra trước tiên xem .htaccess có bị thiếu hoặc hỏng không. Khắc phục theo hai bước.

1. Thử cách một cú nhấp trước. Mở Cài đặt > Đường dẫn tĩnh trong wp-admin, rồi nhấn Lưu thay đổi mà không đổi gì. Nếu WordPress ghi được file, thao tác này sẽ tạo lại nó. Nếu không ghi được, màn hình sẽ hiện lỗi và các quy tắc bạn cần.

2. Nếu vẫn lỗi, hãy tạo file bằng tay. Kết nối qua FTP/SFTP hoặc trình quản lý file của hosting và vào thư mục gốc của trang web, thường là thư mục chứa wp-admin. Kiểm tra xem .htaccess có tồn tại không. Tên file bắt đầu bằng dấu chấm nên một số trình quản lý file ẩn nó theo mặc định; hãy bật “hiển thị file ẩn”.

  • Nếu thiếu, hãy tạo file mới có tên chính xác là .htaccess (không có .txt, không có gì trước dấu chấm).
  • Dán các quy tắc WordPress đã hiển thị, hoặc khối mặc định ở đầu hướng dẫn này. Với bản cài trong thư mục con, hãy đổi RewriteBase và quy tắc cuối cho khớp.
  • Lưu lại, rồi tải lại một permalink bài viết để xác nhận nó hoạt động.

Nếu vẫn 404, .htaccess có thể đang bị bỏ qua. Hãy kiểm tra AllowOverride với nhà cung cấp hosting, vì Apache bỏ qua cả file đúng khi tùy chọn này bị tắt.

Quy tắc của riêng bạn và khối của WordPress

Một plugin hoặc lần chỉnh sửa tay có thể thêm quy tắc riêng, như chuyển hướng, chống hotlink hoặc header cache. Hãy giữ chúng bên ngoài khối của WordPress và ở phía trên khối, để chúng chạy trước quy tắc bắt tất cả của khối:

# Quy tắc do bạn hoặc plugin thêm vào: PHÍA TRÊN các dấu đánh dấu WordPress
<FilesMatch "\.(jpg|jpeg|png|gif)$">
    # ví dụ: chống hotlink, quy tắc cache, v.v.
</FilesMatch>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

Mọi thứ đặt giữa # BEGIN WordPress và # END WordPress sẽ mất ở lần tiếp theo WordPress cập nhật file, và chỉ cần tải màn hình Đường dẫn tĩnh là đủ để kích hoạt việc đó. Các dòng trước và sau dấu đánh dấu được giữ lại. Riêng với chuyển hướng, xem quy tắc chuyển hướng .htaccess WordPress làm đúng cách để biết chúng nên nằm ở đâu và cách tránh vòng lặp.

Lỗi 500 Internal Server Error ngay sau khi sửa file chỉ ra thay đổi bạn vừa làm. Tài liệu của Apache cho biết nhật ký lỗi nhiều khả năng sẽ nêu tên chỉ thị không được phép hoặc lỗi cú pháp. Quy tắc chép từ một hướng dẫn cũ có thể gây ra điều này: Order là lệnh không hợp lệ trên Apache 2.4 trừ khi mod_access_compat được tải. Hãy hoàn tác chỉnh sửa để trang web chạy lại, rồi đọc nhật ký lỗi.

Ngoài khối mặc định

Khối mặc định chỉ xử lý định tuyến permalink và header Authorization. Để siết quyền truy cập vào các file nhạy cảm, như chặn chạy PHP trong /uploads hoặc từ chối yêu cầu trực tiếp tới wp-config.php, xem các quy tắc bảo mật .htaccess WordPress thực sự hữu ích. Nếu permalink trả về 404 vì lý do khác, như cấu trúc permalink sai, lớp cache phục vụ quy tắc cũ hoặc xung đột thư mục con multisite, permalink WordPress không hoạt động sẽ đi qua các nguyên nhân khác.

Câu hỏi thường gặp

File .htaccess mặc định của WordPress là gì? Đó là khối RewriteEngine mà WordPress ghi giữa # BEGIN WordPress và # END WordPress trong file .htaccess ở thư mục gốc của trang web. Khối này chuyển header Authorization cho PHP và gửi mọi yêu cầu không phải file hoặc thư mục thật tới index.php.

Mã .htaccess mặc định chính xác của WordPress là gì? RewriteEngine On, một quy tắc chuyển header Authorization cho PHP, RewriteBase /, một quy tắc cho index.php đi qua, hai điều kiện kiểm tra rằng yêu cầu không phải file hoặc thư mục thật, và một quy tắc cuối gửi mọi thứ còn lại tới index.php. Khối đầy đủ nằm ở đầu hướng dẫn này.

Vì sao tất cả bài viết của tôi bị 404 trừ trang chủ? File .htaccess bị thiếu hoặc hỏng trên Apache tạo ra đúng hiện tượng này. Server tìm được trang chủ mà không cần quy tắc rewrite. Mọi permalink khác cần các quy tắc đó để đến index.php, nên khi không có chúng, Apache tìm một file không tồn tại và trả về 404.

WordPress có tự động tạo lại .htaccess không? Có, trên Apache hoặc LiteSpeed có mod_rewrite, nếu permalink đẹp đang bật và WordPress có thể ghi vào đó. Chỉ cần mở Cài đặt > Đường dẫn tĩnh là đủ để kích hoạt. File bị thiếu thì thư mục phải có quyền ghi, còn file đã có thì bản thân file phải có quyền ghi. Nếu không, màn hình sẽ hiện lỗi, kèm các quy tắc để dán bằng tay.

Vì sao nginx không có file .htaccess của WordPress? nginx không có file cấu hình cấp thư mục như .htaccess của Apache. Cùng logic định tuyến đó được viết thành quy tắc try_files trong cấu hình server của nginx, và quản trị viên phải tự sửa vì WordPress không thể thay đổi nó.

Vì sao .htaccess của tôi bị hỏng sau khi lưu đường dẫn tĩnh? Hãy kiểm tra xem có quy tắc tùy chỉnh nào được đặt bên trong các dấu đánh dấu # BEGIN WordPress và # END WordPress không. WordPress thay thế mọi thứ giữa chúng khi cập nhật file, nên quy tắc đó bị mất. Hãy giữ quy tắc tùy chỉnh ở phía trên các dấu đánh dấu.

Nguồn tham khảo


Dựng lại một file .htaccess sạch và đúng, gồm khối permalink mặc định cùng các quy tắc bảo mật hoặc chuyển hướng bạn thực sự cần, bằng công cụ tạo .htaccess WordPress miễn phí.

FAQ

Câu hỏi

File .htaccess mặc định của WordPress là gì?

Đó là khối RewriteEngine mà WordPress ghi giữa # BEGIN WordPress và # END WordPress trong file .htaccess ở thư mục gốc của trang web. Khối này chuyển header Authorization cho PHP và gửi mọi yêu cầu không phải file hoặc thư mục thật tới index.php.

Mã .htaccess mặc định chính xác của WordPress là gì?

RewriteEngine On, một quy tắc chuyển header Authorization cho PHP, RewriteBase /, một quy tắc cho index.php đi qua, hai điều kiện kiểm tra rằng yêu cầu không phải file hoặc thư mục thật, và một quy tắc cuối gửi mọi thứ còn lại tới index.php. Khối đầy đủ nằm ở đầu hướng dẫn này.

Vì sao tất cả bài viết của tôi bị 404 trừ trang chủ?

File .htaccess bị thiếu hoặc hỏng trên Apache tạo ra đúng hiện tượng này. Server tìm được trang chủ mà không cần quy tắc rewrite. Mọi permalink khác cần các quy tắc đó để đến index.php, nên khi không có chúng, Apache tìm một file không tồn tại và trả về 404.

WordPress có tự động tạo lại .htaccess không?

Có, trên Apache hoặc LiteSpeed có mod_rewrite, nếu permalink đẹp đang bật và WordPress có thể ghi vào đó. Chỉ cần mở Cài đặt > Đường dẫn tĩnh là đủ để kích hoạt. File bị thiếu thì thư mục phải có quyền ghi, còn file đã có thì bản thân file phải có quyền ghi. Nếu không, màn hình sẽ hiện lỗi, kèm các quy tắc để dán bằng tay.

Vì sao nginx không có file .htaccess của WordPress?

nginx không có file cấu hình cấp thư mục như .htaccess của Apache. Cùng logic định tuyến đó được viết thành quy tắc try_files trong cấu hình server của nginx, và quản trị viên phải tự sửa vì WordPress không thể thay đổi nó.

Vì sao .htaccess của tôi bị hỏng sau khi lưu đường dẫn tĩnh?

Hãy kiểm tra xem có quy tắc tùy chỉnh nào được đặt bên trong các dấu đánh dấu # BEGIN WordPress và # END WordPress không. WordPress thay thế mọi thứ giữa chúng khi cập nhật file, nên quy tắc đó bị mất. Hãy giữ quy tắc tùy chỉnh ở phía trên các dấu đánh dấu.