Joomla Bài học 14: Cấu hình URL thân thiện (SEF URLs), URL Rewriting và quản lý Redirects xử lý lỗi 404
Một hệ thống web chuẩn mực không thể để lộ các đường dẫn thô chứa đầy tham số truy vấn như index.php?option=com_content&view=article&id=25&Itemid=102. Trong Joomla Bài học 14, chúng ta sẽ đi sâu vào cơ chế biến đổi đường dẫn của Joomla 5 thành dạng SEF URLs (Search Engine Friendly URLs) ngắn gọn, cấu hình URL Rewriting ở tầng Web Server (Apache/Nginx), loại bỏ ID khỏi đường dẫn bài viết và vận hành hệ thống Redirects để kiểm soát triệt để lỗi 404 Not Found.
1. Bản chất quá trình biến đổi URL trong Joomla 5
Quá trình một đường dẫn nội bộ biến thành đường dẫn đẹp diễn ra qua 3 giai đoạn độc lập trong bộ định tuyến (Joomla Router):
| Giai đoạn & Trạng thái cấu hình | Hình thái URL hiển thị | Giải thích kỹ thuật |
|---|---|---|
| 1. Tắt SEF URLs | domain.com/index.php?option=com_content&view=article&id=15&Itemid=101 |
Joomla đọc trực tiếp biến $_GET để gọi Component com_content, View article. |
| 2. SEF cơ bản (Bật SEF URLs - Chưa bật Rewrite) |
domain.com/index.php/tin-tuc/15-kien-truc-joomla-5 |
Router ánh xạ Itemid=101 thành alias của Menu (tin-tuc), nhưng vẫn phải đi qua file vật lý index.php. |
| 3. Modern SEF + Rewrite (Bật URL Rewriting + Remove IDs) |
domain.com/tin-tuc/kien-truc-joomla-5 |
Web Server (Nginx/Apache) chặn request từ đầu và đẩy ngầm về index.php. Router bỏ hoàn toàn số ID 15- ở đầu bài viết. |
2. Cấu hình SEF URLs và URL Rewriting trên Web Server
Để kích hoạt giai đoạn 3, bạn cần kết hợp cấu hình trong Global Configuration và cấu hình tại máy chủ chạy web (Apache hoặc Nginx).
Bước 1: Bật cấu hình trong Joomla Administrator
Truy cập System Global Configuration Tab Site Mục SEO:
-
Search Engine Friendly URLs: Chọn Yes.
-
Use URL Rewriting: Chọn Yes.
-
Add Suffix to URL: Chọn No (Nếu bật Yes, Joomla sẽ thêm đuôi
.htmlvào cuối mọi đường dẫn nhưbai-viet.html— hiện nay chuẩn SEO hiện đại ưu tiên URL không đuôi). -
Unicode Aliases:
-
Chọn No (Khuyên dùng): Tự động chuyển đổi tiêu đề Tiếng Việt có dấu thành không dấu (
Bài học 14bai-hoc-14). -
Chọn Yes: Giữ nguyên chữ có dấu trên URL (
[domain.com/bài-học-14](https://domain.com/bài-học-14)), dễ gây lỗi mã hóa ký tự (%C3%A0...) khi chia sẻ link qua một số nền tảng.
-
Bước 2: Thiết lập Rewrite Rule trên Web Server
-
Trường hợp 1: Máy chủ chạy Apache / LiteSpeed Trong thư mục gốc mã nguồn (
/var/www/html/), Joomla cung cấp sẵn filehtaccess.txt. Bạn chỉ cần đổi tên file này thành.htaccess(và đảm bảo modulemod_rewritecủa Apache đã được bật):Bash
mv src/htaccess.txt src/.htaccess -
Trường hợp 2: Máy chủ chạy Nginx (Môi trường Docker chúng ta dựng ở Bài 2) Nginx không đọc file
.htaccess. Toàn bộ sức mạnh nằm ở chỉ thịtry_filestrong filedocker/nginx/default.confmà chúng ta đã thiết lập:Nginx
location / { # Nếu không tìm thấy file vật lý ($uri) hoặc thư mục ($uri/), # đẩy toàn bộ đường dẫn về cho index.php xử lý kèm query string try_files $uri $uri/ /index.php?$args; }
3. Loại bỏ số ID khỏi URL bài viết (Modern Routing - Remove IDs)
Mặc định, khi bạn tạo một Menu là Category Blog (/tin-tuc), các bài viết bên trong khi click vào sẽ có dạng /tin-tuc/15-ten-bai-viet (số 15 là id của bài viết trong bảng #__content). Để xóa bỏ con số này giúp URL sạch tuyệt đối:
-
Truy cập Content Articles Bấm nút Options (góc trên bên phải).
-
Chuyển sang tab Integration Tìm đến mục Routing.
-
Tại dòng Remove IDs from URLs, chuyển sang Yes Bấm Save & Close.
Lưu ý kỹ thuật cho Backend: Khi bật
Remove IDs = Yes, Router của Joomla sẽ phải truy vấn cộtaliastrong bảng#__contentkết hợp vớicatidđể tìm ra bài viết thay vì tìm trực tiếp qua khóa chínhid. Vì trong bảng#__contentđã có sẵn Composite Indexidx_aliasvà ràng buộc không cho phép 2 bài viết cùng một Category trùngalias, tốc độ truy vấn vẫn được đảm bảo ở mức mili-giây.
4. Quản lý chuyển hướng (Redirects) và Xử lý lỗi 404
Khi bạn đổi tên Alias của một bài viết cũ hoặc xóa một Menu Item đã được Google lập chỉ mục, khách truy cập vào link cũ sẽ gặp lỗi 404 Page Not Found. Joomla 5 tích hợp sẵn bộ công cụ Redirects (com_redirect) kết hợp với System - Redirect Plugin để tự động thu thập và điều hướng các link hỏng này.
Bước 1: Kích hoạt Plugin theo dõi lỗi 404
-
Vào System Manage Plugins.
-
Tìm plugin System - Redirect và bật trạng thái sang Enabled.
- Mẹo tối ưu Database: Mở chi tiết plugin System - Redirect, bật tùy chọn Collect URLs = Yes khi bạn đang cần rà soát lỗi 404 sau khi nâng cấp web. Tuy nhiên, nếu website bị bot quét hàng vạn link rác không tồn tại mỗi ngày, bạn có thể tạm tắt Collect URLs để tránh làm phình bảng
#__redirect_links, trong khi các link chuyển hướng bạn đã tạo sẵn vẫn hoạt động bình thường!
- Mẹo tối ưu Database: Mở chi tiết plugin System - Redirect, bật tùy chọn Collect URLs = Yes khi bạn đang cần rà soát lỗi 404 sau khi nâng cấp web. Tuy nhiên, nếu website bị bot quét hàng vạn link rác không tồn tại mỗi ngày, bạn có thể tạm tắt Collect URLs để tránh làm phình bảng
Bước 2: Thiết lập điều hướng 301 trong Component Redirects
-
Truy cập System Information / Manage Redirects (hoặc từ Dashboard chọn Redirects).
-
Tại đây bạn sẽ thấy danh sách các đường dẫn bị lỗi 404 được hệ thống tự động ghi nhận kèm cột 404 Hits (số lần khách truy cập bị lỗi).
-
Click vào một đường dẫn bị lỗi (hoặc bấm New):
-
Expired URL: Đường dẫn cũ bị lỗi (Ví dụ:
/tin-tuc/bai-viet-cu). -
New URL: Đường dẫn mới cần chuyển tới (Ví dụ:
/tin-tuc/bai-viet-moi-chuan-seo). -
Status: Chuyển thành Enabled.
-
Mặc định, Joomla sẽ trả về mã phản hồi HTTP 301 (Moved Permanently) giúp chuyển toàn bộ sức mạnh SEO (Link Juice) từ link cũ sang link mới. Nếu bật Advanced Mode trong Options của Redirects, bạn có thể chọn thêm các mã HTTP khác như
302 Found(Tạm thời) hoặc410 Gone(Đã xóa vĩnh viễn).
-
5. Giải phẫu Code PHP: Cách tạo SEF URL bằng Route::_() (Góc nhìn Backend)
Khi bạn lập trình Giao diện (Template), Module hay Component trong Joomla 5, tuyệt đối không bao giờ gõ cứng (hardcode) đường dẫn tương đối kiểu <a href="/tin-tuc/bai-viet">.
Thay vào đó, bạn phải truyền đường dẫn nội bộ qua lớp Joomla\CMS\Router\Route::_()結合 với RouteHelper của Component tương ứng. Lớp này sẽ tự động tra cứu Menu Item (Itemid), gắn tiền tố ngôn ngữ (/vi/, /en/) và biến đổi thành SEF URL chuẩn xác dựa theo cấu hình Global:
PHP
use Joomla\CMS\Router\Route;
use Joomla\Component\Content\Site\Helper\RouteHelper as ContentRouteHelper;
// 1. Tạo SEF URL cho một đường dẫn tĩnh hoặc theo Itemid của Menu (Ví dụ Menu ID = 105)
$menuUrl = Route::_('index.php?Itemid=105');
// 2. Tạo SEF URL chuẩn xác đến một bài viết cụ thể trong com_content
// Giả sử bài viết có ID = 42, Alias = 'hoc-joomla-5', thuộc Category ID = 8, Ngôn ngữ = 'vi-VN'
$articleSlug = '42:hoc-joomla-5'; // Hoặc chỉ cần truyền 42
$categoryId = 8;
$language = 'vi-VN';
// ContentRouteHelper::getArticleRoute sẽ tự động dò tìm Itemid phù hợp nhất của Category 8
$rawArticleRoute = ContentRouteHelper::getArticleRoute($articleSlug, $categoryId, $language);
// Biến đổi thành SEF URL hoàn chỉnh (Mặc định tham số thứ 2 là $xhtml = true để escape ký tự & thành &)
$sefArticleUrl = Route::_($rawArticleRoute);
// 3. Nếu muốn lấy Absolute URL (có cả http://domain.com/...) để gửi trong Email hoặc Webhook:
$fullAbsoluteUrl = Route::link(
'site',
$rawArticleRoute,
false,
Route::TLS_IGNORE,
true // $absolute = true
);
echo '<a href="' . $sefArticleUrl . '">Xem chi tiết bài viết</a>';
Cơ chế hoạt động của System - Redirect Plugin ở tầng Exception:
Ở tầng Core PHP, khi Router không tìm thấy bài viết hoặc Menu nào khớp với URL, Joomla sẽ ném ra ngoại lệ Joomla\CMS\Router\Exception\RouteNotFoundException (Mã lỗi 404). Plugin System - Redirect đăng ký lắng nghe sự kiện onError của hệ thống:
-
Nó lấy URL hiện tại mà người dùng vừa gọi, truy vấn vào bảng
#__redirect_linkstheo cộtold_url. -
Nếu tìm thấy bản ghi có
published = 1, nó lập tức gọi$app->redirect($newUrl, $headerStatusCode)để cứu người dùng khỏi trang lỗi 404. -
Nếu chưa có trong bảng, nó thực hiện lệnh
INSERT(hoặcUPDATE hits = hits + 1) vào bảng#__redirect_linksđể báo cáo cho Admin biết.
6. Tổng kết bài học
-
Nắm vững 3 cấp độ biến đổi URL trong Joomla và cách cấu hình kết hợp giữa Global Configuration với Nginx (
try_files) / Apache (.htaccess). -
Biết cách bật Remove IDs from URLs trong phần Integration của Component để loại bỏ số thứ tự thừa trên đường dẫn.
-
Làm chủ công cụ Redirects (
com_redirect) để xử lý lỗi 404 bằng HTTP 301 và thành thạo việc sử dụngRoute::_()trong code PHP.
Trong Bài học 15, chúng ta sẽ tiếp tục hoàn thiện bức tranh tối ưu hóa công cụ tìm kiếm với: Tối ưu hóa SEO On-page, cấu hình Metadata, Robots và tạo Sitemap tự động.
All rights reserved