Server Configuration (Apache/Nginx)
Thiết lập file cấu hình máy chủ để tối ưu hóa bảo mật, hiệu năng (gzip/brotli), redirect, cache và xử lý URL.
Server Configuration (Apache/Nginx) là gì?
Server Configuration (cấu hình máy chủ) là việc thiết lập các file cấu hình của web server như Apache (.htaccess hoặc httpd.conf) hoặc Nginx (nginx.conf hoặc file trong /etc/nginx/sites-available/) để kiểm soát cách máy chủ xử lý yêu cầu HTTP từ người dùng và công cụ tìm kiếm. Đây không phải là lập trình, mà là khai báo quy tắc: khi nào chuyển hướng, khi nào nén nội dung, khi nào trả mã trạng thái, hoặc khi nào lưu cache.
Tại sao quan trọng trong SEO?
Cấu hình máy chủ ảnh hưởng trực tiếp đến ba trụ cột SEO kỹ thuật: tốc độ tải trang, khả năng thu thập (crawling), và tính toàn vẹn của URL. Một cấu hình sai có thể khiến Googlebot không truy cập được trang, làm chậm thời gian render, hoặc tạo hàng loạt URL trùng lặp — tất cả đều gây tổn hại thứ hạng. Ngược lại, cấu hình đúng giúp:
- Giảm thời gian phản hồi (TTFB) xuống dưới 200ms — yếu tố xếp hạng xác nhận bởi Google;
- Đảm bảo chỉ một phiên bản URL (ví dụ:
https://example.com, không cówwwhoặchttp) được index; - Tăng tỷ lệ thành công khi thu thập nhờ redirect 301 chính xác và robots.txt linh hoạt;
- Hạn chế tấn công và bot xấu bằng giới hạn request — giảm tải server và bảo vệ trải nghiệm người dùng.
Cách hoạt động
Khi trình duyệt hoặc Googlebot gửi yêu cầu tới domain, web server đọc file cấu hình theo thứ tự ưu tiên (Apache: từ global → virtual host → .htaccess; Nginx: từ nginx.conf → server block → location block). Máy chủ sau đó áp dụng từng quy tắc theo thứ tự xuất hiện — ví dụ: nếu có rule rewrite trước expires, thì URL sẽ được đổi trước rồi mới xét cache. Các directive không có hiệu lực ngay — phải reload (Nginx) hoặc restart (Apache) để áp dụng.
Hướng dẫn thực hiện
Dưới đây là các cấu hình thiết yếu, phân biệt rõ giữa Apache và Nginx:
1. Thiết lập HTTPS bắt buộc và redirect chuẩn
Apache (trong .htaccess hoặc virtual host):
RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
Nginx (trong server block cho port 80):
server {
listen 80;
server_name www.example.com example.com;
return 301 https://example.com$request_uri;
}
2. Bật nén Gzip/Brotli
Gzip hỗ trợ trên mọi phiên bản Apache/Nginx. Brotli yêu cầu Nginx ≥ 1.11.6 + module ngx_brotli được biên dịch sẵn (không có sẵn trên Ubuntu mặc định).
| Tính năng | Apache | Nginx |
|---|---|---|
| Gzip | LoadModule deflate_module modules/mod_deflate.soAddOutputFilterByType DEFLATE text/html text/css application/javascript |
gzip on;gzip_types text/css application/javascript text/xml; |
| Brotli | Không hỗ trợ gốc — cần module bên ngoài (ít dùng) | load_module modules/ngx_http_brotli_filter_module.so;brotli on;brotli_types text/css application/javascript; |
3. Cache tĩnh (browser caching)
Mục tiêu: đặt Cache-Control hợp lý cho tài nguyên không thay đổi (CSS, JS, ảnh).
Apache:
<IfModule mod_expires.c>
ExpiresActive On
ExpiresByType image/jpg "access plus 1 year"
ExpiresByType text/css "access plus 1 month"
</IfModule>
Nginx:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
4. Xử lý URL thân thiện và loại bỏ đuôi .php
Tránh URL dạng https://example.com/page.php. Dùng rewrite để ẩn đuôi:
Apache:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ $1.php [L,QSA]
Nginx:
location / {
try_files $uri $uri/ $uri.php?$args;
}
Lỗi thường gặp
- Redirect vòng (redirect loop): xảy ra khi rule redirect thiếu điều kiện chặn — ví dụ quên
RewriteCond %{HTTPS} offkhi redirect HTTPS. Cách khắc phục: kiểm tra bằng curl:curl -I https://example.com, xem số lần301/302tăng liên tục. - Cache sai cho trang động: đặt
expires 1ycho.php→ người dùng thấy nội dung cũ. Cách khắc phục: chỉ cache tài nguyên tĩnh; với PHP, dùngCache-Control: no-cachehoặcmax-age=0. - .htaccess bị bỏ qua: do
AllowOverride Nonetrong cấu hình Apache. Cách khắc phục: sửahttpd.conf, đổi thànhAllowOverride Alltrong<Directory>tương ứng. - Nginx 404 khi dùng try_files: do thiếu
index index.phptrong block server. Cách khắc phục: thêm dòngindex index.php;vào đầu blockserver.
Ví dụ thực tế
Một website tin tức Việt Nam (example.vn) từng bị Google index cả phiên bản http, www, và https://www — gây phân mảnh authority. Sau khi cấu hình Nginx như sau:
# Redirect tất cả về https://example.vn
server {
listen 80;
server_name example.vn www.example.vn;
return 301 https://example.vn$request_uri;
}
server {
listen 443 ssl http2;
server_name www.example.vn;
return 301 https://example.vn$request_uri;
}
# Chính
server {
listen 443 ssl http2;
server_name example.vn;
# ... phần còn lại
}
Sau 12 ngày, số URL trùng lặp trong Google Search Console giảm 92%, và traffic organic tăng 17% nhờ tập trung link equity.
Câu hỏi thường gặp
.htaccess có nên dùng trong sản xuất không?
Không khuyến khích. Mỗi request đều phải đọc lại .htaccess, làm chậm Apache. Tốt nhất cấu hình trực tiếp trong virtual host và tắt AllowOverride. Chỉ dùng .htaccess khi không thể chỉnh cấu hình server (ví dụ: shared hosting).
Nên chọn Gzip hay Brotli?
Brotli nén tốt hơn Gzip (giảm thêm 15–20% kích thước), nhưng chỉ hoạt động trên trình duyệt hỗ trợ (Chrome, Firefox, Edge từ 2016 trở đi). Với website có >85% traffic từ các trình duyệt này, nên bật Brotli song song với Gzip làm dự phòng. Cách kiểm tra: dùng công cụ KeyCDN Brotli Test.
Có cần cache HTML bằng server config không?
Không — trừ trường hợp trang tĩnh hoàn toàn. Với trang động (PHP, WordPress), cache HTML nên xử lý ở tầng ứng dụng (plugin WP Super Cache) hoặc reverse proxy (Varnish, Cloudflare). Cấu hình server chỉ nên cache tài nguyên tĩnh (CSS, JS, ảnh) vì chúng ít thay đổi và dễ kiểm soát.