File .htaccess mặc định của WordPress: nội dung và cách khôi phục
Khối .htaccess chính xác mà WordPress ghi cho permalink, khi nào WordPress tự tạo lại nó, và cách khôi phục bằng tay khi bài viết bị 404 nhưng trang chủ vẫn tải được.
File .htaccess mặc định của WordPress là khối RewriteEngine ngắn mà phần mềm ghi vào .htaccess ở thư mục gốc trang web của bạn, để permalink như /2026/10/ten-bai-viet/ được giải quyết thay vì trả về 404. Nó có dạng như sau:
# BEGIN 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>
# END WordPress
Đó là khối chính xác, được trích từ hướng dẫn chính thức của WordPress về Apache HTTP Server và logic rewrite được mô tả trên trang HelpHub về permalink đẹp. Nếu RewriteBase của bạn không phải / — chẳng hạn vì WordPress được cài trong một thư mục con — nó sẽ khớp với đường dẫn đó thay vào đó, và điều này cũng bình thường, do chính WordPress tạo ra.
Điểm chính
- WordPress tự tạo khối này, chỉ trên Apache và LiteSpeed, mỗi khi file có quyền ghi và bạn lưu Cài đặt > Đường dẫn tĩnh.
- Nếu file bị thiếu hoặc hỏng, mọi permalink trừ trang chủ sẽ trả về 404, vì chỉ trang chủ mới tìm được mà không cần quy tắc rewrite.
- Bất cứ gì bạn hoặc một plugin thêm vào phải nằm trên
# BEGIN WordPress, không bao giờ nằm trong các dấu đánh dấu — WordPress ghi đè mọi thứ ở giữa mỗi khi lưu đường dẫn tĩnh.
Cần dựng lại file với đường dẫn thật và thêm vài quy tắc? Công cụ tạo .htaccess cho WordPress lắp ráp một file đúng ngay trong trình duyệt của bạn.
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ó dòng này, mọi thứ bên dưới đều không hoạt động.
RewriteBase / báo cho Apache biết các đường dẫn được viết lại là tương đối so với thư mục gốc trang web. WordPress đặt giá trị này khớp với nơi trang web thực sự đặt — một bản cài trong thư mục con nhận RewriteBase /blog/, không phải /.
RewriteRule ^index\.php$ - [L] là một rào chắn không có tác dụng: 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 file thật, và KHÔNG khớp với thư mục thật?”. Cả hai phải đúng để quy tắc cuối cùng kích hoạt — nhờ vậy một ảnh thật, một file CSS, hay một PDF đã tải lên được phục vụ trực tiếp và không bao giờ chạm vào hệ thống định tuyến của WordPress.
RewriteRule . /index.php [L] là thứ làm cho permalink hoạt động: bất cứ gì sống sót qua hai điều kiện trên — nghĩa là không phải file hay thư mục thật — được gửi tới index.php, và hệ thống định tuyến riêng của WordPress (WP_Query, các thẻ rewrite) quyết định URL đó thực sự là bài viết, trang, hay lưu trữ nào.
Khi nào WordPress tạo lại file này, và khi nào không thể
WordPress tự cố gắng ghi .htaccess mỗi khi bạn mở Cài đặt > Đường dẫn tĩnh và nhấn Lưu thay đổi, dù không có gì thay đổi trên màn hình. Việc lưu này kích hoạt flush_rewrite_rules(), cố gắng mở .htaccess để ghi và chèn khối hiện tại vào giữa các dấu đánh dấu.
Việc này thất bại âm thầm, khiến file bị thiếu hoặc lỗi thời, khi:
- File hoặc thư mục cha của nó không có quyền ghi đối với người dùng mà PHP đang chạy. Trên nhiều hosting chia sẻ, PHP chạy dưới một người dùng hệ thống khác với người đã tải file lên qua FTP, vì vậy quyền trông có vẻ đúng trong một ứng dụng FTP vẫn có thể chặn WordPress ghi file.
- Bạn dùng nginx.
.htaccesschỉ là cơ chế của Apache và LiteSpeed (chính tài liệu của Apache vềAllowOverridegiải thích tại sao: nginx không có file cấu hình theo từng thư mục được đọc lại mỗi yêu cầu). Tương đương trên nginx là chỉ thịtry_filesbên trong khối server, chỉ ai có quyền truy cập server mới sửa được; WordPress không bao giờ có thể viết nó cho bạn. AllowOverrideđược đặt thànhNonecho thư mục trang web của bạn trong cấu hình chính của Apache. Đây là thiết lập cho phép.htaccessghi đè bất cứ gì; tài liệu Apache nói rõ: vớiAllowOverride None, “các file .htaccess bị bỏ qua hoàn toàn” — WordPress có thể ghi một file hoàn hảo, và nó vẫn không có tác dụng gì cho đến khi thiết lập này được thay đổi ở cấp server.- File đã bị xóa hoặc chưa từng tồn tại, và có điều gì trong lần lưu không kích hoạt việc tái tạo — phổ biến nhất là vì cấu trúc đường dẫn tĩnh đã giống nhau, nên WordPress không thấy thay đổi nào để viết lại.
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 hoạt động, đó là dấu hiệu điển hình của .htaccess bị thiếu hoặc hỏng. Sửa nó theo hai bước.
1. Thử cách sửa một cú nhấp trước. Vào Cài đặt > Đường dẫn tĩnh trong bảng điều khiển WordPress và nhấn Lưu thay đổi mà không thay đổi gì. Nếu file có quyền ghi, chỉ riêng việc này đã tái tạo nó và xong.
2. Nếu không hiệu quả, 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ào thư mục nơi WordPress được cài đặt (thư mục chứa wp-config.php), và kiểm tra xem .htaccess có tồn tại hay không — đây là file ẩn, một số trình quản lý file ẩn nó theo mặc định; hãy bật “hiện file ẩn”.
- Nếu thiếu, tạo một file mới với tên chính xác là
.htaccess(không phải.txt, không có gì trước dấu chấm). - Dán khối mặc định ở trên, điều chỉnh
RewriteBasenếu WordPress nằm trong một thư mục con. - Lưu lại, rồi tải lại permalink của một bài viết để xác nhận nó hoạt động.
Nếu vẫn 404 sau đó, nguyên nhân đã chuyển từ “.htaccess bị thiếu” sang “.htaccess bị bỏ qua” — hỏi hosting của bạn về AllowOverride, vì một file đúng nằm trong thư mục mà Apache được lệnh bỏ qua sẽ hành xử giống hệt như không có file.
Quy tắc của riêng bạn so với khối của WordPress
Một plugin hoặc chỉnh sửa tay có thể thêm quy tắc riêng — chuyển hướng, chống hotlink, header cache. Đây là một khối riêng biệt, khác với khối WordPress tạo ra, và hai khối này không nên chồng lấp:
# Quy tắc do bạn hoặc một plugin thêm vào — NẰM 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
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
Bất cứ gì đặt giữa # BEGIN WordPress và # END WordPress sẽ bị xóa âm thầm vào lần tiếp theo ai đó lưu màn hình Đường dẫn tĩnh, vì WordPress coi toàn bộ đoạn đó là của mình và viết lại hoàn toàn. Đây là nguyên nhân phổ biến nhất của “quy tắc riêng của tôi biến mất” — nó không bao giờ bị xóa một cách cố ý, chỉ là nó nằm trong một khối mà WordPress coi là của riêng mình. Riêng về chuyển hướng, xem quy tắc chuyển hướng .htaccess của WordPress làm đúng cách để biết chúng nên nằm ở đâu và cách tránh vòng lặp.
Đây cũng là nguyên nhân phổ biến nhất của một 500 Internal Server Error bất ngờ ngay sau khi chỉnh sửa file: một quy tắc sao chép từ một bài viết diễn đàn viết cho phiên bản Apache khác (cú pháp Order/Deny của 2.2 trộn với cú pháp Require của 2.4) làm hỏng việc phân tích toàn bộ file, kể cả khối WordPress bên dưới nó, và toàn bộ trang web sập — không chỉ phần bạn đã chỉnh sửa.
Vượt ra ngoài khối mặc định
Khối mặc định chỉ xử lý định tuyến permalink. Nếu bạn cũng muốn siết chặt quyền truy cập các file nhạy cảm hoặc thêm một ít quy tắc .htaccess thực sự giảm bề mặt tấn công — chặn thực thi PHP trong /uploads, 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 của WordPress thực sự hữu ích. Và nếu permalink bị 404 vì lý do khác — cấu trúc đường dẫn tĩnh sai, một lớp cache đang phục vụ quy tắc cũ, xung đột multisite trong thư mục con — đường dẫn tĩnh WordPress không hoạt động đ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 để permalink được giải quyết về index.php thay vì trả về 404.
Mã .htaccess mặc định chính xác của WordPress là gì?
RewriteEngine On, RewriteBase /, một quy tắc cho qua đối với index.php, hai điều kiện kiểm tra yêu cầu không phải file hay thư mục thật, và một quy tắc cuối cùng gửi mọi thứ còn lại tới index.php. Khối đầy đủ được trích ở đầu bài hướng dẫn này.
Vì sao tất cả bài viết của tôi bị 404 trừ trang chủ?
Trang chủ có thể được tìm thấy mà không cần quy tắc rewrite nào; mọi permalink khác đều cần chúng. Một .htaccess bị thiếu hoặc hỏng trên Apache tạo ra chính xác mô hình này.
WordPress có tự động tạo lại .htaccess không?
Chỉ khi file có quyền ghi — lưu lại Cài đặt > Đường dẫn tĩnh sẽ kích hoạt điều này. Nếu file không có quyền ghi, bị thiếu trên một hosting không tự tạo nó, hoặc AllowOverride bị tắt, WordPress không thể sửa điều đó cho bạn và bạn phải tạo hoặc sửa file bằng tay.
Vì sao nginx không có file .htaccess của WordPress?
.htaccess chỉ hoạt động trên Apache và LiteSpeed. nginx không có file cấu hình theo thư mục và bỏ qua .htaccess hoàn toàn; định tuyến tương tự được viết dưới dạng quy tắc try_files trong khối server của nginx.
Vì sao .htaccess của tôi bị hỏng sau khi lưu đường dẫn tĩnh?
Một quy tắc riêng được đặt bên trong các dấu đánh dấu # BEGIN WordPress / # END WordPress thay vì ở phía trên, và WordPress đã ghi đè toàn bộ đoạn đó vào lần lưu đường dẫn tĩnh kế tiếp.
Dựng lại một .htaccess sạch và đúng — khối permalink mặc định cộng với bất kỳ quy tắc bảo mật hay 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 ngắn mà WordPress ghi vào .htaccess ở thư mục gốc của trang web để permalink hoạt động. Nó nằm giữa các dòng chú thích # BEGIN WordPress và # END WordPress, gửi mọi yêu cầu không phải file hoặc thư mục thật tới index.php, nơi WordPress quyết định hiển thị gì.
Mã .htaccess mặc định chính xác của WordPress là gì?
RewriteEngine On, RewriteBase /, một quy tắc cho phép file và thư mục đã tồn tại đi qua không đổi, và một RewriteRule cuối cùng gửi mọi thứ còn lại tới index.php kèm giữ nguyên query string. Khối đầy đủ được trích dẫn dưới đây và khớp với khối WordPress tự tạo trong Cài đặt > Đường dẫn tĩnh.
Vì sao tất cả bài viết của tôi bị 404 trừ trang chủ?
Đây là dấu hiệu điển hình của file .htaccess bị thiếu hoặc hỏng trên Apache. Trang chủ tải được vì server tìm thấy index.php trực tiếp, nhưng mọi permalink khác cần các quy tắc rewrite để đến đó, và không có chúng, Apache chỉ 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?
Chỉ khi file có quyền ghi và bạn lưu lại Cài đặt > Đường dẫn tĩnh. WordPress kiểm tra xem có thể ghi vào file không, và nếu được, sẽ viết lại khối giữa các dấu đánh dấu. Nếu file bị thiếu, chỉ đọc, hoặc thuộc về một người dùng khác với người dùng chạy PHP, WordPress sẽ thất bại âm thầm và bạn phải tạo file bằng tay.
Vì sao nginx không có file .htaccess của WordPress?
Vì .htaccess là tính năng của Apache (và LiteSpeed); nginx không có tương đương và bỏ qua file hoàn toàn. Trên nginx, logic định tuyến tương tự được viết dưới dạng chỉ thị try_files trong một khối server, mà chỉ nhà cung cấp hosting hoặc quản trị hệ thống mới có thể chỉnh sửa.
Vì sao .htaccess của tôi bị hỏng sau khi lưu đường dẫn tĩnh?
Hầu như luôn vì một plugin hoặc lần chỉnh sửa tay trước đó đã đặt quy tắc riêng bên trong các dấu đánh dấu của WordPress thay vì ở phía trên. WordPress ghi đè toàn bộ nội dung giữa # BEGIN WordPress và # END WordPress mỗi khi đường dẫn tĩnh được lưu, nên bất kỳ quy tắc nào đặt bên trong sẽ bị xóa mà không báo trước.