Rewrite và .htaccess: Khác biệt & Lưu ý khi chuyển từ NGINX và Apache sang Caddy trong ServBay
Thông tin nền tảng
URL Rewrite (thường gọi tắt là Rewrite hoặc viết lại URL), còn được biết đến như là "giả tĩnh", là kỹ thuật giúp thay đổi động địa chỉ URL ở tầng máy chủ web. Nhờ vậy, URL gốc do người dùng hoặc công cụ tìm kiếm truy cập (ví dụ: /?page=123
) sẽ được máy chủ chuyển hướng nội bộ thành một URL khác (ví dụ: /posts/123/
), trong khi dãy địa chỉ trên trình duyệt vẫn hiển thị URL sau khi rewrite. Kỹ thuật này phổ biến nhằm các mục đích:
- Làm đẹp cấu trúc URL: Tạo URL "thân thiện", dễ đọc, dễ ghi nhớ và chia sẻ.
- Tối ưu SEO: Công cụ tìm kiếm ưu tiên những URL miêu tả rõ ràng và có cấu trúc.
- Ẩn chi tiết nội bộ: Giấu đi đường dẫn file hoặc tham số truy vấn, tăng bảo mật cho hệ thống.
- Chuẩn hóa URL: Ép buộc sử dụng định dạng URL nhất định (ví dụ có hoặc không có
www
, dùng HTTPS). - Hiện thực routing: Các framework web hiện đại thường dùng Rewrite để chuyển mọi request về một file duy nhất như
index.php
cho xử lý trung tâm.
Hiểu và cấu hình đúng các luật Rewrite là kỹ năng căn bản trong phát triển web.
Hỗ trợ NGINX và Apache trong ServBay
ServBay tích hợp và hỗ trợ hoàn toàn cả NGINX lẫn Apache làm máy chủ web. Người dùng có thể chuyển đổi dễ dàng máy chủ web mặc định tùy theo nhu cầu dự án hoặc sở thích cá nhân.
Để biết cách chuyển máy chủ web mặc định, hãy xem tài liệu: Cách thiết lập mặc định máy chủ web
ServBay mang đến nhiều lựa chọn máy chủ web phổ biến như Caddy, NGINX và Apache cho nhà phát triển. Nhằm đơn giản hóa cấu hình môi trường local, ServBay đã cài sẵn các luật Rewrite thông dụng cho Caddy và NGINX, đáp ứng đa số nhu cầu của framework và CMS hiện đại. Điều này đồng nghĩa, với các ứng dụng quen thuộc như WordPress, Laravel, Symfony v.v., bạn thường không cần cấu hình lại Rewrite, ứng dụng sẽ chạy ngay trên ServBay - thực sự "plug-and-play".
Tuy nhiên, nếu bạn quen dùng Apache hoặc NGINX và đang dự định hay chuyển website/dự án sang dùng Caddy tích hợp sẵn trong ServBay, việc hiểu rõ sự khác biệt cấu hình Rewrite là thiết yếu. Bài viết này sẽ phân tích chi tiết điểm khác nhau giữa Apache, NGINX và Caddy khi cấu hình Rewrite, cũng như các lưu ý khi chuyển đổi.
Rewrite sẵn sàng sử dụng: Lợi thế của ServBay
Lưu ý quan trọng
Một trong các triết lý thiết kế chủ đạo của ServBay là đơn giản hóa việc cài đặt môi trường local cho phát triển. Với đa số ứng dụng và framework phổ biến, ServBay đã cấu hình sẵn luật Rewrite hoàn thiện. Nhờ đó, khi chạy các ứng dụng này trên ServBay, bạn hầu như không cần sửa đổi hay tự viết lại luật Rewrite. Những cấu hình cốt lõi đã sẵn sàng cho bạn.
Nếu bạn đang chuyển một site vốn chạy trên Apache hoặc NGINX sang Caddy của ServBay, và có các quy tắc Rewrite tùy chỉnh phức tạp, hãy tham khảo các hướng dẫn chi tiết sau:
Giới thiệu về luật Rewrite trên các máy chủ web
Mỗi máy chủ web sử dụng cú pháp và cấu trúc file khác nhau để cấu hình luật Rewrite. Hiểu các khác biệt này là nền tảng cho việc chuyển đổi môi trường. Dưới đây là tổng quan nhanh về cách Apache, NGINX và Caddy cấu hình Rewrite.
File .htaccess của Apache
Apache HTTP Server dùng file .htaccess
để đặt luật Rewrite. .htaccess
là file cấu hình phân tán, thường nằm ở thư mục gốc hoặc các thư mục con của website. Các luật trong đó ghi đè lên cấu hình chính ở mức thư mục (trừ khi thư mục con có .htaccess
riêng). Apache sử dụng module mod_rewrite
để xử lý các luật Rewrite.
Ví dụ sử dụng cơ bản
Dưới đây là một ví dụ phổ biến về file .htaccess
, dùng để chuyển tất cả request không phải file/thư mục thật về index.php
(kiểu routing trung tâm của các CMS/framework PHP):
# Bật Rewrite Engine
RewriteEngine On
# Nếu không phải file hay thư mục thật, mới áp dụng luật rewriting
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Chuyển tất cả request về index.php, giữ nguyên query string
RewriteRule ^(.*)$ index.php [L,QSA]
2
3
4
5
6
7
8
9
Giải thích:
RewriteEngine On
: Kích hoạt tính năng Rewrite cho thư mục hiện tại.RewriteCond %{REQUEST_FILENAME} !-f
: Điều kiện kiểm tra đường dẫn request không phải file thật.RewriteCond %{REQUEST_FILENAME} !-d
: Điều kiện kiểm tra đường dẫn request không phải thư mục thật.RewriteRule ^(.*)$ index.php [L,QSA]
: Luật Rewrite chính:^(.*)$
: match mọi đường dẫn URL.index.php
: chuyển đến fileindex.php
.[L]
: "Last" - sau khi áp dụng luật này thì dừng.[QSA]
: "Query String Append" - giữ lại chuỗi query cũ.
Luật Rewrite của NGINX
NGINX cấu hình Rewrite qua file chính (nginx.conf
) hoặc các file site riêng (thường nằm ở conf.d
hoặc sites-available
/sites-enabled
). Luật thường nằm ở block server
(định nghĩa virtual host) hoặc block location
(match URL cụ thể). Module ngx_http_rewrite_module
của NGINX rất mạnh nhưng cú pháp khác biệt so với Apache.
Ví dụ sử dụng cơ bản
Sau đây là ví dụ config NGINX cho chức năng routing về index.php
tương tự:
server {
listen 80;
server_name servbay.demo; # Ví dụ domain sử dụng ServBay
root /Applications/ServBay/www/demo; # Thư mục gốc website
# Thử lần lượt: file, thư mục, cuối cùng rewrite về index.php
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# Xử lý request file .php - chuyển tới PHP-FPM/FastCGI
location ~ \.php$ {
# Đảm bảo chỉ chạy file tồn tại, tránh thực thi sai
try_files $uri =404;
include fastcgi_params;
# Đường dẫn socket PHP FastCGI mặc định trên ServBay
fastcgi_pass unix:/Applications/ServBay/tmp/php-cgi.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Giải thích:
location /
: Bắt mọi request từ root.try_files $uri $uri/ /index.php?$query_string;
:- Kiểm tra file thật.
- Kiểm tra thư mục thật.
- Nếu không có, chuyển về
/index.php
và giữ query string.
location ~ \.php$
: match mọi request kết thúc bằng.php
.fastcgi_pass unix:/Applications/ServBay/tmp/php-cgi.sock;
: Chuyển request PHP sang PHP FastCGI mặc định của ServBay.
Luật Rewrite trong Caddy
Caddy cấu hình qua file riêng có tên Caddyfile
. Thiết kế của Caddyfile hướng đến sự đơn giản, dễ đọc, vẫn mạnh mẽ. Cú pháp Rewrite ở Caddy dùng lệnh rewrite
và các "matcher" (bộ lọc linh hoạt).
Ví dụ sử dụng cơ bản
Đây là đoạn Caddyfile
mẫu cho routing về index.php
:
servbay.demo { # Domain sử dụng ServBay
root * /Applications/ServBay/www/demo # Thư mục gốc website
# Chuyển request PHP đến PHP FastCGI mặc định của ServBay
php_fastcgi unix//Applications/ServBay/tmp/php-cgi.sock
# Phục vụ file tĩnh
file_server
# Định nghĩa matcher @notStatic: chỉ khi file/thư mục không tồn tại
@notStatic {
not {
file {
# Thử file {path} hoặc {path}/
# Nếu không có, @notStatic sẽ khớp
try_files {path} {path}/
}
}
}
# Dùng @notStatic thì rewrite sang /index.php
rewrite @notStatic /index.php
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Giải thích:
servbay.demo { ... }
: Khối cấu hình cho domainservbay.demo
.root * /Applications/ServBay/www/demo
: Chỉ định thư mục gốc site.php_fastcgi unix//Applications/ServBay/tmp/php-cgi.sock
: Gửi request.php
/liên quan PHP tới PHP FastCGI mặc định của ServBay.file_server
: Câu lệnh siêu ngắn phục vụ file tĩnh.@notStatic { ... }
: Đặt tên matcher lànotStatic
.not { file { try_files {path} {path}/ } }
: Nêu nếu không phải file/thư mục thật thì matcher đúng.rewrite @notStatic /index.php
: Nếu matcher đúng, rewrite sang/index.php
.
Trong cấu hình mặc định của ServBay, chỉ thị php_fastcgi
đã bao gồm logic try_files
tương tự, và ServBay sẽ tự động sinh Caddyfile
cơ bản cho site mới, phù hợp phần lớn framework mà không cần sửa thêm. Ví dụ trên minh họa cách dùng cú pháp gốc của Caddy.
Lưu ý khi chuyển từ Apache/NGINX sang Caddy trong ServBay
Khi chuyển website từ môi trường Apache hoặc NGINX sang dùng Caddy trong ServBay, bước convert luật Rewrite rất quan trọng. Dù ServBay đã chuẩn bị nhiều luật phổ biến, nếu dự án của bạn có nhiều luật tùy chỉnh, bạn cần tự chuyển đổi thủ công.
Đừng quên xem kỹ tài liệu chuyển đổi:
Những điểm khác biệt cần lưu ý khi chuyển đổi:
Cú pháp và vị trí cấu hình Rewrite:
- Apache: Dùng file
.htaccess
(phân tán - từng thư mục) hoặc file cấu hình chính (httpd.conf
/cấu hình site). Chủ yếu dùng lệnhRewriteRule
vàRewriteCond
, dựa trên regex. - NGINX: Dùng file chính (
nginx.conf
) hoặc các file cấu hình site (tập trung). Kết hợp blocklocation
, lệnhrewrite
,if
,try_files
, khác biệt đáng kể so với Apache. - Caddy: Chỉ dùng file
Caddyfile
(tập trung). Các luật Rewrite dùng lệnhrewrite
kèm matcher (file
,path
,header
, ...), cú pháp ngắn gọn, trực quan. - Chuyển đổi: Bạn cần tự convert các luật
.htaccess
của Apache hoặc blocklocation
/rewrite
/try_files
của NGINX theo cú pháp Caddyfile. Do sự khác biệt biểu đạt lớn nên việc này chủ yếu phải làm thủ công, khó có công cụ chuyển đổi tự động "một-trong-một" hoàn hảo. Nên đọc kỹ tài liệu về rewrite/matcher của Caddy để nắm cơ chế hoạt động.
- Apache: Dùng file
Cấu trúc file cấu hình:
- Apache: Mỗi thư mục có thể tự có file
.htaccess
, hoặc config tập trung theo từng VirtualHost. - NGINX: Cấu hình tập trung trong
nginx.conf
cùng các file site, tổ chức bằng blockserver
vàlocation
. - Caddy: Chỉ dùng
Caddyfile
, mỗi site là một block theo domain, trong block đặt tất cả chỉ thị. Cấu trúc rõ ràng, phẳng và dễ đọc hơn NGINX.
- Apache: Mỗi thư mục có thể tự có file
Tương ứng module & chỉ thị:
- Apache/NGINX có nhiều module và chỉ thị riêng. Caddy cũng rất mạnh nhưng tên chỉ thị và cách dùng có thể khác. Ví dụ, chức năng của
mod_rewrite
(Apache) được Caddy cung cấp thông quarewrite
cùng matcher; hay lệnhtry_files
của NGINX trong Caddy nằm trong matcherfile
hoặc được tích hợp sẵn trong các chỉ thị nhưphp_fastcgi
. - Khi chuyển đổi luôn nên tra tài liệu của Caddy để tìm chỉ thị tương ứng.
- Apache/NGINX có nhiều module và chỉ thị riêng. Caddy cũng rất mạnh nhưng tên chỉ thị và cách dùng có thể khác. Ví dụ, chức năng của
Hành vi mặc định và thứ tự ưu tiên:
- Mỗi máy chủ có logic mặc định khác nhau cho quá trình xử lý request và áp dụng rule. Apache đọc từ
.htaccess
, NGINX quyết định bằng mức ưu tiên blocklocation
, còn Caddy ưu tiên thứ tự chỉ thị trong Caddyfile. - Sau chuyển đổi nên thử nghiệm toàn diện tất cả đường dẫn, đảm bảo mọi URL hoạt động đúng như mong đợi. Đặc biệt lưu ý: phần lớn cấu hình cơ bản đã có sẵn trong Caddy của ServBay, tránh ghi đè/rối cấu hình.
- Mỗi máy chủ có logic mặc định khác nhau cho quá trình xử lý request và áp dụng rule. Apache đọc từ
Tổng kết
ServBay đem lại trải nghiệm phát triển local linh hoạt với đủ cả Caddy, NGINX lẫn Apache. Dù đã cấu hình sẵn rất nhiều luật Rewrite cho Caddy & NGINX, giúp hầu hết ứng dụng phổ biến chạy ngay, nhưng nếu bạn từng quen tự viết rule tùy chỉnh trên Apache hoặc NGINX và muốn chuyển lên Caddy, hãy chú ý sự khác biệt cách cấu hình Rewrite.
Apache quản lý luật Rewrite qua file .htaccess
cùng lệnh RewriteRule
/RewriteCond
(phân tán), NGINX cấu hình tập trung với block server
/location
, lệnh rewrite
/try_files
, còn Caddy lại chọn hướng đi tối giản với Caddyfile, lệnh rewrite
và matcher cực kỳ linh hoạt.
Điều quan trọng nhất khi chuyển đổi là chuyển các luật Rewrite đã có sang đúng cú pháp của Caddyfile. Dù cần chút thời gian làm quen/chuyển đổi thủ công, nhưng với cú pháp đơn giản và các mẫu cấu hình, tài liệu hỗ trợ chi tiết của ServBay và Caddy sẽ giúp bạn nhanh chóng tùy biến môi trường mong muốn. Mong bài viết này hỗ trợ bạn hiểu rõ sự khác biệt, từ đó phát triển web hiệu quả trên ServBay!