Hôm nay chúng ta sẽ cùng tìm hiểu về chuyển hướng HTTP (redirect), hay còn gọi là chuyển hướng URL. Đây là một kỹ thuật dùng để trỏ một tên miền hoặc địa chỉ này sang một địa chỉ khác. Redirect có rất nhiều mục đích sử dụng khác nhau và cũng có vài loại để chúng ta cân nhắc sử dụng. Về cơ bản, redirect sẽ được dùng mỗi khi bạn muốn người dùng truy cập một địa chỉ A sau đó được tự động đưa đến địa chỉ B.

Trong quá trình xây dựng nội dung và quản trị server sẽ có lúc bạn cần chuyển hướng traffic từ nơi này sang nơi khác. Sau đây, chúng ta cùng nhau thảo luận về các trường hợp sử dụng kỹ thuật redirect và cách thực hiện chúng trên Apache và Nginx – hai web server phổ biến nhất hiện nay.
Bạn cần làm gì trước khi bắt đầu?
Để thực hành theo bài viết này, bạn cần có:
- Một server Ubuntu 20.04 đã được cài đặt theo hướng dẫn thiết lập server ban đầu cho Ubuntu 20.04, bao gồm một sudo non-root user và firewall.
- Apachehoặc Nginx đã được cài đặt sẵn trên server.
Bạn có thể tham khảo lại hướng dẫn Cách cài đặt Apache trên Ubuntu 20.04 hoặc Cách cài đặt Nginx trên Ubuntu 20.04 nếu cần.
Trên thực tế, bạn hoàn toàn có thể cài đặt cả Apache và Nginx trên cùng một server – nhiều hệ thống hiện đại còn tận dụng cả hai để khai thác tối đa ưu điểm của từng web server. Tuy nhiên, mặc định cả Apache và Nginx đều sử dụng các cổng HTTP/HTTPS tiêu chuẩn là 80 và 443, nên chúng sẽ bị xung đột nếu chạy đồng thời.
Vì vậy, nếu bạn đang thực hiện theo hướng dẫn này trên một server mới cài đặt, tức là chưa cài web server nào, thì bạn chỉ nên cài một trong hai để tránh lỗi và dễ theo dõi hơn trong quá trình cấu hình.
Bước 1 – Tìm hiểu các phương pháp Redirect
Redirect được sử dụng trong rất nhiều trường hợp, bao gồm:
- Đổi tên miền: Nếu bạn đã có một website hoạt động và giờ muốn chuyển sang tên miền mới thì đừng vội “bỏ rơi” tên miền cũ. Các bookmark (dấu trang) của người dùng và những liên kết từ các trang web khác trỏ đến website của bạn sẽ báo lỗi nếu nội dung đột ngột biến mất mà không có bất kỳ hướng dẫn nào để trình duyệt biết địa chỉ mới. Việc đổi tên miền mà không redirect sẽ khiến trang web mất đi lượng truy cập (traffic) từ người dùng cũ và đánh mất uy tín mà bạn đã dày công xây dựng.
- Sở hữu nhiều biến thể tên miền: Một mẹo khá hay là bạn nên đăng ký thêm các biến thể của tên miền chính để tận dụng traffic từ những người dùng gõ nhầm địa chỉ. Ví dụ, nếu bạn đang sở hữu tên miền là
myspiders.com, bạn có thể mua thêm các phiên bản nhưmyspiders.netvàmyspiders.orgrồi thiết lập redirect để tất cả trỏ về trang chínhmyspiders.com. Điều này không chỉ giúp bạn giữ chân những người dùng nhập sai đuôi tên miền, mà còn hạn chế nguy cơ người khác đăng ký các tên miền tương tự để “ăn theo” thương hiệu hoặc lưu lượng truy cập của trang web chính. - Thay đổi URL của trang con: Đôi khi bạn sẽ cần thay đổi đường dẫn (URL) của trang con đã được xuất bản và đang có người truy cập đều đặn. Nếu không xử lý đúng cách, việc này có thể dẫn đến lỗi 404 Not Found hoặc các lỗi khác tùy thuộc vào cấu hình bảo mật của server.
Để tránh những lỗi này, bạn nên thiết lập redirect để tự động đưa họ đến đúng trang mới chứa nội dung mà họ đang tìm kiếm.

Các loại URL redirect
Có hai loại URL redirect phổ biến nhất là 302 temporary redirects (redirect tạm thời) và 301 permanent redirects (redirect vĩnh viễn).
Redirect tạm thời (temporary redirects)
Redirect tạm thời cần dùng trong những tình huống mà nội dung tại một URL nào đó chỉ tạm thời được chuyển sang một địa chỉ khác.
Ví dụ: Khi bạn đang bảo trì trang web, bạn có thể sử dụng redirect tạm thời để chuyển toàn bộ người dùng sang một trang thông báo, giải thích rằng trang đang được bảo trì và sẽ sớm hoạt động trở lại.
Redirect loại này sẽ báo cho trình duyệt biết rằng nội dung chỉ tạm thời nằm ở một vị trí khác, và trong tương lai, người dùng vẫn có thể truy cập lại URL ban đầu.
Redirect vĩnh viễn (Permanent Redirects)
Redirect vĩnh viễn cần dùng trong trường hợp nội dung trên website đã được chuyển hẳn sang một địa chỉ mới.
Điều này rất cần thiết khi bạn cần đổi tên miền hoặc khi URL cần thay đổi vì lý do nào đó và không còn sử dụng địa chỉ cũ nữa. Redirect loại này sẽ báo với trình duyệt là URL cũ không còn được sử dụng nữa nên từ giờ hãy cập nhật lại sang URL mới.
Bắt buộc phải dùng SSL
Một ứng dụng phổ biến của redirect là chuyển hướng toàn bộ traffic của trang web sang sử dụng SSL thay vì HTTP thông thường.
Khi sử dụng redirect, bạn có thể buộc mọi yêu cầu đến http://www.mysite.comđược chuyển hướng đến https://www.mysite.com. Nếu bạn sử dụng Let’s Encrypt để cài đặt HTTPS, hệ thống thường sẽ tự động tạo sẵn cấu hình redirect này cho bạn.
Ở phần tiếp theo, chúng ta sẽ cùng xem qua một vài ví dụ cấu hình redirect bằng web server Apache. Nếu bạn đang dùng Nginx và không có ý định dùng Apache, bạn có thể bỏ qua và đến thẳng Bước 3.
Bước 2 – Cách Redirect trong Apache
Có nhiều cách khác nhau để Apache hỗ trợ bạn thiết lập redirect. Với những redirect đơn giản, bạn có thể sử dụng các công cụ có sẵn trong module mod_alias (đã được bật sẵn theo mặc định). Còn nếu bạn cần redirect phức tạp hơn, thì module mod_rewrite sẽ là lựa chọn linh hoạt hơn.
Sử dụng chỉ thị Redirect
Trong Apache, bạn có thể redirect một trang web cụ thể bằng chỉ thị (directive) Redirect, được tích hợp sẵn trong module mod_alias (đã được bật mặc định). Chỉ thị này cần ít nhất hai đối số: URL cũ và URL mới.
Các server block của Apache có thể được lưu trong file cấu hình chính ở /etc/apache2/apache2.conf, nhưng để dễ bảo trì hơn, bạn nên tạo một file mới trong /etc/apache2/sites-available/ cho mỗi cấu hình.
Ngoài ra, Apache sử dụng một cơ chế khá tiện lợi để bật/tắt từng site. Bạn sẽ tạo file cấu hình trong sites-available/, rồi tạo symbolic link (giống như shortcut) đến thư mục sites-enabled/ để kích hoạt nó.
Mặc định, khi cài Apache, hệ thống sẽ tạo sẵn một cấu hình mẫu trong file là /etc/apache2/sites-available/000-default.conf và file này sẽ được kích hoạt qua link /etc/apache2/sites-enabled/000-default.conf.
Bạn có thể mở file cấu hình đó bằng nano hoặc trình soạn thảo văn bản mà bạn quen dùng:
sudo nano /etc/apache2/sites-available/000-default.conf
Mặc định, file cấu hình này chứa một cấu hình web server cơ bản: Apache được cấu hình để mở cổng 80, tiếp nhận các yêu cầu HTTP từ trình duyệt và tìm file index.html nằm trong thư mục /var/www/html trên hệ thống của bạn.
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request's Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
…
</VirtualHost>
Nếu bạn cần redirect các yêu cầu từ domain1.com đến domain2.com, bạn có thể xóa các chỉ thị hiện có trong server block này và thay thế chúng bằng một redirect vĩnh viễn:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName www.domain1.com
Redirect / <http://www.domain2.com>
</VirtualHost>
<VirtualHost *:80>
ServerName www.domain2.com
. . .
. . .
</VirtualHost>
Lưu và đóng file lại. Nếu bạn dùng nano, nhấn Ctrl+X, sau đó Y và Enter.
Redirect này hướng dẫn trình duyệt chuyển tất cả các yêu cầu cho www.domain1.com sang www.domain2.com. Lưu ý, đây chỉ là cho một trang, không phải toàn bộ trang web.
Mặc định, chỉ thị Redirect tạo ra một redirect 302 (tạm thời). Nếu bạn muốn tạo một redirect vĩnh viễn (permanent), bạn có thể làm theo một trong hai cách sau:
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName www.domain1.com
Redirect 301 /oldlocation <http://www.domain2.com/newlocation>
</VirtualHost>
/etc/apache2/sites-available/000-default.conf
<VirtualHost *:80>
ServerName www.domain1.com
Redirect permanent /oldlocation <http://www.domain2.com/newlocation>
</VirtualHost>
Sử dụng chỉ thị RedirectMatch
Để redirect nhiều trang hơn, bạn có thể sử dụng chỉ thị RedirectMatch. Chỉ thị này cho phép bạn xác định các mẫu URL cần redirect bằng biểu thức chính quy (regular expressions), giúp bạn áp dụng redirect linh hoạt hơn thay vì phải liệt kê từng trang một.
Điều này cho phép bạn redirect toàn bộ thư mục thay vì chỉ một file đơn lẻ.
Chỉ thị RedirectMatch cho phép bạn dùng biểu thức chính quy để khớp các mẫu đường dẫn (URL). Những phần nằm trong dấu ngoặc đơn sẽ được coi là các nhóm khớp và bạn có thể tái sử dụng nội dung đã khớp trong đường dẫn mới bằng cú pháp $1, trong đó 1 là nhóm văn bản đầu tiên. Các nhóm tiếp theo được đánh số tuần tự.
Ví dụ, nếu bạn muốn khớp tất cả các yêu cầu đến thư mục /images (và các file con trong đó) đến một subdomain tên là images.example.com, bạn có thể sử dụng như sau:
/etc/apache2/sites-available/default
<VirtualHost *:80>
…
RedirectMatch ^/images/(.*)$ <http://images.example.com/$1>
…
</VirtualHost>
Tương tự như chỉ thị Redirect, với RedirectMatch bạn cũng có thể chỉ định loại redirect (tạm thời hay vĩnh viễn) bằng cách thêm mã trạng thái redirect (ví dụ 301, 302) ngay trước URL đích trong câu lệnh.
Sau khi chỉnh sửa file cấu hình, để các thay đổi có hiệu lực, bạn cần khởi động lại Apache. Trên server Ubuntu hiện đại, bạn có thể dùng lệnh sau bằng systemctl:
sudo systemctl restart apache2
Redirect bằng mod_rewrite
Cách linh hoạt nhất nhưng cũng phức tạp nhất để tạo các quy tắc redirect là sử dụng module có tên mod_rewrite. Nếu bạn muốn tìm hiểu sâu hơn, có thể tham khảo thêm bài viết: Cách viết lại URL với mod_rewrite trong Apache.
Ở phần tiếp theo, bạn sẽ được hướng dẫn cách thiết lập redirect trong web server Nginx.
Lưu ý: Nếu bạn đang cài cả Apache và Nginx trên cùng một server, bạn cần đảm bảo rằng cổng 80 (HTTP) đang không bị Apache chiếm dụng trước khi bắt đầu cấu hình Nginx.
Bạn có thể gỡ tạm thời Apache bằng apt remove, gỡ bằng cách này sẽ vẫn giữ lại các file cấu hình, phòng khi sau này bạn muốn cài lại. Hoặc bạn cũng có thể đổi cấu hình Apache để nó không còn nghe ở cổng 80 nữa vì cả Apache, Nginx và HTTP đều mặc định sử dụng cổng 80.
Bước 3 – Cách Redirect trong Nginx
Trong Nginx, redirect là một tính năng cốt lõi và được thực hiện bằng cách sử dụng các chỉ thị phổ biến sẵn có của Nginx. Thông thường, để thiết lập redirect, bạn chỉ cần tạo một server block mới cho từng URL hoặc domain mà bạn muốn chuyển hướng.
Các server block của Nginx có thể được lưu trong file cấu hình chính /etc/nginx/nginx.conf, nhưng để dễ quản lý, bạn nên tạo một file riêng trong thư mục /etc/nginx/sites-available/ cho mỗi cấu hình. Theo quy ước của Nginx, bạn sẽ bật hoặc tắt các cấu hình này bằng cách tạo symbolic link từ sites-available/ sang thư mục sites-enabled/.
Mặc định, khi cài đặt Nginx, hệ thống sẽ tạo sẵn một cấu hình mẫu tại /etc/nginx/sites-available/default, và nó được bật/tắt thông qua liên kết tới /etc/nginx/sites-enabled/default.
Bạn có thể mở file cấu hình đó bằng nano hoặc trình soạn thảo văn bản thường dùng:
sudo nano /etc/nginx/sites-available/default
Mặc định, nó chứa một cấu hình web server tiêu chuẩn sẽ lắng nghe trên port 80 và tìm file index.html trong thư mục /var/www/html trên hệ thống của bạn.
/etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
…
root /var/www/html;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
…
}
Nếu bạn cần chuyển hướng các yêu cầu từ domain1.com sang domain2.com, bạn có thể xóa các chỉ thị hiện có trong server block này và thay thế chúng bằng một redirect vĩnh viễn:
/etc/nginx/sites-available/default
server {
listen 80;
server_name domain1.com;
return 301 $scheme://domain2.com$request_uri;
}
Lưu và đóng file. Nếu bạn đang dùng nano, hãy nhấn Ctrl+X, sau đó nhấn Y khi được hỏi, và cuối cùng là Enter.
Chỉ thị return sẽ thực hiện việc thay thế URL và trả về mã trạng thái HTTP kèm theo địa chỉ mới để chuyển hướng.
Trong ví dụ này, nó sử dụng biến $scheme để giữ nguyên giao thức ban đầu của yêu cầu (dù là http hay https). Sau đó, Nginx sẽ trả về mã redirect vĩnh viễn 301 cùng với URL mới.
Nếu bạn muốn redirect một thư mục sang một subdomain riêng biệt, bạn có thể thực hiện bằng cách sử dụng chỉ thị rewrite, tương tự như cách redirect thư mục trong Apache.
Khi đặt trong một server block, chỉ thị rewrite có thể tạo redirect tạm thời cho tất cả các yêu cầu gửi đến thư mục /images, chuyển hướng chúng sang subdomain images.example.com:
/etc/nginx/sites-available/default
server {
…
rewrite ^/images/(.*)$ <http://images.example.com/$1> redirect;
…
}
Để chuyển thành redirect vĩnh viễn, bạn chỉ cần thay từ redirect thành permanent ở cuối câu lệnh.
Sau khi chỉnh sửa cấu hình, bạn cần khởi động lại Nginx để các thay đổi có hiệu lực. Trên các máy chủ Ubuntu hiện đại, bạn có thể dùng lệnh sau bằng systemctl:
$sudo systemctl restart nginx
Bạn hoàn toàn có thể mở rộng cấu hình này theo nhiều cách khác nhau. Việc nắm vững và áp dụng tốt các nguyên tắc cơ bản của Nginx sẽ giúp bạn tạo ra các cấu hình rõ ràng, gọn gàng, đồng thời dễ dàng xử lý các tình huống đặc biệt phát sinh trong quá trình quản lý lưu lượng truy cập đến server.
Kết luận
Vậy là đến đây, bạn đã biết cách cấu hình cả redirect tạm thời và redirect vĩnh viễn cho hai web server phổ biến là Apache và Nginx rồi nhé!
Một lưu ý nhỏ nhưng quan trọng: hãy chọn đúng loại redirect cho từng tình huống để không làm ảnh hưởng đến thứ hạng SEO website.
Khi redirect hợp lý, bạn có thể giữ nguyên lượng truy cập và giá trị từ trang web cũ, đồng thời vẫn linh hoạt thay đổi cấu trúc website khi cần mà không lo bị mất traffic hay người dùng.
Nếu bạn đang dùng Nginx và muốn tìm hiểu thêm, có thể xem bài viết “Cách tạo Redirect tạm thời và vĩnh viễn với Nginx” để biết thêm chi tiết.