Nội dung bài viết

NukeViet là mã nguồn mở khá phổ biến ở Việt Nam, đặc biệt trong khối trường học và cơ quan nhà nước. Một câu hỏi được hỏi đi hỏi lại là làm sao bỏ index.php khỏi đường dẫn, để URL từ:

https://example.com/index.php/tin-tuc/bai-viet.html

thành:

https://example.com/tin-tuc/bai-viet.html

Ngoài chuyện nhìn gọn hơn, URL sạch cũng có lợi cho SEO và dễ chia sẻ hơn nhiều.

Trường hợp thường gặp

Bạn đã kiểm tra đủ thứ: web server là Apache, module rewrite đã bật, đã vào admin bật tùy chọn rewrite, nhưng URL vẫn cứ còn index.php. Đây chính là tình huống tôi từng mắc.

Lý do là NukeViet lưu cờ hỗ trợ rewrite trong một file cấu hình riêng, và trong một số trường hợp giao diện quản trị không ghi được giá trị mới vào file đó.

Cách sửa

Truy cập vào thư mục sau bằng FTP hoặc File Manager của hosting:

/data/config/

Tìm file có tên theo dạng config_ini.tenmiencuaban.php. Ví dụ tên miền của tôi là nguyenlap.net thì file sẽ là:

config_ini.nguyenlap.net.php

Mở file đó ra và tìm dòng:

$sys_info['supports_rewrite'] = false;

Đổi giá trị thành true:

$sys_info['supports_rewrite'] = true;

Lưu file lại, sau đó vào trang quản trị và chạy dọn dẹp hệ thống để xóa cache. URL sẽ hết index.php.

Kiểm tra trước khi sửa

Nếu sau khi làm xong mà toàn bộ trang con báo lỗi 404, nghĩa là rewrite chưa thực sự hoạt động ở tầng server. Kiểm tra lần lượt:

Module rewrite đã bật chưa. Trên VPS dùng Apache:

sudo a2enmod rewrite
sudo systemctl restart apache2

File .htaccess có được đọc không. Trong cấu hình Apache, thư mục chứa web phải cho phép ghi đè:

<Directory /var/www/html>
    AllowOverride All
</Directory>

AllowOverride None là nguyên nhân phổ biến nhất khiến .htaccess bị bỏ qua hoàn toàn mà không báo lỗi gì.

File .htaccess của NukeViet đã tồn tại chưa. NukeViet có sẵn file mẫu tên htaccess.txt trong thư mục gốc. Đổi tên nó thành .htaccess nếu chưa có.

Nếu server dùng Nginx

.htaccess chỉ có tác dụng với Apache. Trên Nginx bạn phải khai báo rewrite trong khối server:

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

Sau khi sửa, kiểm tra cấu hình rồi nạp lại:

sudo nginx -t
sudo systemctl reload nginx

Bước nginx -t rất đáng làm: nó bắt lỗi cú pháp trước khi bạn reload, tránh việc làm sập toàn bộ web server chỉ vì một dấu chấm phẩy.

Sau khi đổi URL

Nếu website đã chạy một thời gian và được Google lập chỉ mục với URL cũ, đừng để hai dạng URL cùng tồn tại. Thêm chuyển hướng 301 từ dạng cũ sang dạng mới để không mất thứ hạng tìm kiếm và không bị đánh giá là nội dung trùng lặp:

RewriteCond %{THE_REQUEST} \s/index\.php/(.*)\s [NC]
RewriteRule ^ /%1 [R=301,L]

Đặt đoạn này trong .htaccess, phía trên các luật rewrite sẵn có của NukeViet.