Lỗi Gặp Phải
Bạn đã cài đặt WordPress Multisite, thêm một site mới và cố truy cập vào đó. Thay vì hiển thị site, bạn lại nhận được thông báo này:
No site defined on this host! If you are the owner of this site, please check Debugging WordPress for further assistance.
Lỗi này xảy ra với cả cài đặt kiểu subdomain (site1.example.com) lẫn kiểu subdirectory (example.com/site1). WordPress đã truy vấn bảng wp_blogs để tìm host được yêu cầu, không tìm thấy kết quả khớp và dừng lại. Domain trong trình duyệt và domain trong cơ sở dữ liệu đang không đồng bộ — đó là nguyên nhân cốt lõi.
Nguyên Nhân Gốc Rễ
- Domain trong trình duyệt không khớp với giá trị lưu trong
wp_blogshoặcwp_site. wp-config.phpthiếu các hằng số bắt buộc cho Multisite, hoặc chúng trỏ tới domain sai.- Site được thêm với một domain, sau đó domain thay đổi — cơ sở dữ liệu vẫn còn lưu domain cũ.
- Quá trình migration đã sao chép cơ sở dữ liệu nhưng bỏ qua bước cập nhật URL.
- Wildcard DNS cho các subdomain không phân giải được về server.
Cách Sửa 1 — Kiểm Tra Các Hằng Số trong wp-config.php
Mở wp-config.php và xác nhận các dòng sau tồn tại và chính xác:
define( 'MULTISITE', true );
define( 'SUBDOMAIN_INSTALL', true ); // false for subdirectory
define( 'DOMAIN_CURRENT_SITE', 'example.com' );
define( 'PATH_CURRENT_SITE', '/' );
define( 'SITE_ID_CURRENT_SITE', 1 );
define( 'BLOG_ID_CURRENT_SITE', 1 );
DOMAIN_CURRENT_SITE phải khớp chính xác với domain bạn đang truy cập. Không có tiền tố www trừ khi site chính của bạn sử dụng nó. Nếu bạn truy cập www.example.com nhưng hằng số lại ghi là example.com, mọi tra cứu subdomain sẽ thất bại âm thầm — chỉ một lỗi đánh máy này đã gây ra rất nhiều ticket hỗ trợ.
Cách Sửa 2 — Kiểm Tra Bản Ghi Trong Cơ Sở Dữ Liệu
Đăng nhập vào MySQL và kiểm tra hai bảng quan trọng:
-- Kiểm tra bản ghi network (site)
SELECT * FROM wp_site;
-- Kiểm tra các bản ghi blog riêng lẻ
SELECT blog_id, domain, path, archived, deleted FROM wp_blogs;
So sánh cột domain với những gì bạn đang yêu cầu trong trình duyệt. Các trường hợp không khớp sau migration thường trông như thế này:
-- Cơ sở dữ liệu ghi:
domain = 'site1.old-domain.com'
-- Nhưng bạn đang truy cập:
https://site1.new-domain.com
Sửa bằng các lệnh UPDATE có mục tiêu cụ thể:
-- Cập nhật network root
UPDATE wp_site SET domain = 'new-domain.com' WHERE id = 1;
-- Cập nhật blog chính
UPDATE wp_blogs SET domain = 'new-domain.com' WHERE blog_id = 1;
-- Cập nhật một sub-site cụ thể (blog_id = 2 ở đây)
UPDATE wp_blogs SET domain = 'site1.new-domain.com' WHERE blog_id = 2;
Đừng dừng lại ở đó. Mỗi site có bảng options riêng — hãy kiểm tra cả những bảng đó:
-- Options của site chính
SELECT option_name, option_value FROM wp_options
WHERE option_name IN ('siteurl', 'home');
-- Sub-site với blog_id = 2 (tiền tố bảng = wp_2_)
SELECT option_name, option_value FROM wp_2_options
WHERE option_name IN ('siteurl', 'home');
Cập nhật bất kỳ URL cũ nào bạn tìm thấy ở đó.
Cách Sửa 3 — Wildcard DNS cho Cài Đặt Kiểu Subdomain
Multisite dạng subdomain cần một bản ghi DNS wildcard. Nếu không có, site1.example.com sẽ không bao giờ đến được server của bạn — WordPress thậm chí không nhìn thấy request, chứ chưa nói đến việc định tuyến nó.
Thêm bản ghi này vào nhà cung cấp DNS của bạn:
Type: A
Name: *
Value: YOUR_SERVER_IP
TTL: 3600
Đợi vài phút để DNS lan truyền, sau đó xác minh:
dig site1.example.com +short
# Nên trả về IP server của bạn
Đang test ở local? Thêm các mục thủ công vào /etc/hosts thay vì chờ DNS:
127.0.0.1 example.com
127.0.0.1 site1.example.com
127.0.0.1 site2.example.com
Cách Sửa 4 — Cấu Hình Web Server
Nginx
server_name của bạn phải chấp nhận wildcard subdomain. Một lỗi phổ biến là chỉ liệt kê domain gốc:
server {
listen 80;
server_name example.com *.example.com;
root /var/www/html;
index index.php;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
Reload sau khi thay đổi: sudo nginx -t && sudo systemctl reload nginx
Apache
Đảm bảo ServerAlias bao gồm các subdomain và mod_rewrite đã được bật:
<VirtualHost *:80>
ServerName example.com
ServerAlias *.example.com
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Cũng kiểm tra xem .htaccess có chứa các rewrite rule cho Multisite không. WordPress tạo ra những rule này trong quá trình thiết lập network. Nếu chúng bị mất, hãy lưu lại cài đặt permalink — hoặc lấy trực tiếp từ màn hình Network Setup và dán vào thủ công.
Cách Sửa 5 — Sau Khi Migration hoặc Đổi Domain
Vừa migrate từ server khác? Đổi tên domain? Đừng tự tay chỉnh từng bảng một. Hãy dùng lệnh bulk search-replace của WP-CLI:
# Chạy thử trước — luôn luôn làm vậy
wp search-replace 'old-domain.com' 'new-domain.com' --network --dry-run
# Áp dụng khi kết quả hiển thị đúng
wp search-replace 'old-domain.com' 'new-domain.com' --network
# Xóa toàn bộ cache
wp cache flush --network
Flag --network chạy lệnh thay thế trên mọi bảng của từng site — wp_2_options, wp_3_options, và cứ thế tiếp tục. Với một network có 20 site, một lệnh này thay thế cho hơn 40 câu query thủ công.
Xác Minh
Sau khi áp dụng cách sửa, hãy xác nhận mọi thứ thực sự hoạt động trước khi coi là xong:
# 1. Kiểm tra WordPress có thể thấy tất cả site
wp site list --fields=blog_id,url,public,archived
# 2. Curl trực tiếp sub-site — bỏ qua cache trình duyệt
curl -I http://site1.example.com
# Kỳ vọng: HTTP/1.1 200 OK (hoặc redirect 301 sang HTTPS)
# 3. Xác nhận bản ghi DB trông đúng
wp db query "SELECT blog_id, domain, path FROM wp_blogs;"
# 4. Quét error log PHP để tìm lỗi còn sót
tail -f /var/log/php/error.log
Phòng Ngừa
- Trước khi migrate: chụp lại toàn bộ URL của site bằng
wp site list— bạn sẽ biết chính xác những gì cần cập nhật ở phía bên kia. - Sau khi đổi domain: chạy
wp search-replace --networktrước khi site đi vào hoạt động, không phải sau khi người dùng bắt đầu báo lỗi 404. - Wildcard SSL: Cài đặt HTTPS cần chứng chỉ bao gồm
*.example.com, không chỉ domain gốc. Chứng chỉ chỉ có bare-domain sẽ làm hỏng mọi subsite. - Môi trường staging: giữ một file
wp-config.phpriêng vớiDOMAIN_CURRENT_SITEcủa chính nó. Như vậy, khi ai đó import bản dump cơ sở dữ liệu production vào staging sẽ không làm hỏng staging một cách âm thầm.

