Tôi đã tìm kiếm nhiều bài viết trên internet nhưng nó không hoạt động.
Có lẽ bởi vì đây là một yêu cầu kỳ lạ. Tôi sẽ ngạc nhiên nếu bạn có thể tìm thấy bất kỳ mã nào mà bạn có thể chỉ cần sao chép/dán để thực hiện việc này.
Tuy nhiên, giả sử bạn đang xây dựng URL tuyệt đối chính xác cho tất cả các liên kết nội bộ của mình (vì bạn không được liên kết nội bộ tới một URL chuyển hướng) thì điều này tương đối đơn giản để triển khai trong .htaccess
nếu bạn hiểu các chỉ thị hiện có của mình.
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.*)$ https://example.com/$1 [L,R=301]
biểu thức chính quy .*
bên trong viết lại quy tắc
mẫu diêm mọi thứ. Cụ thể, nó khớp với 0 hoặc nhiều ký tự bất kỳ, được biểu thị bằng *
định lượng. Nó khớp với đường dẫn URL trống (tức là "trang chủ") và mọi đường dẫn URL không trống (tức là mọi thứ khác).
Bạn cần thay đổi biểu thức chính quy ở trên để nó khớp với đường dẫn URL không trống (nghĩa là mọi thứ trừ trang chủ). Và tạo một quy tắc khác (theo hướng khác) chỉ khớp với đường dẫn URL trống.
(Điều này sử dụng thực tế là mod_dir đang phục vụ index.php
đối với các yêu cầu đến trang chủ, không phải chỉ thị mod_rewrite theo sau.)
Để khớp với 1 hoặc nhiều (ví dụ: đường dẫn URL không trống), bạn có thể sử dụng +
(cộng) định lượng, thay vì *
(dấu sao/dấu hoa thị).
Ví dụ:
# Chuyển hướng mọi thứ trừ trang chủ (từ www sang non-www)
RewriteCond %{HTTP_HOST} ^www\.example\.com [NC]
RewriteRule ^(.+)$ https://example.com/$1 [L,R=301]
# Chỉ chuyển hướng trang chủ (từ không có www sang có www)
RewriteCond %{HTTP_HOST} ^example\.com [NC]
RewriteRule ^$ https://www.example.com/ [L,R=301]
Bạn sẽ cần xóa bộ nhớ cache của trình duyệt trước khi thử nghiệm, vì chuyển hướng 301 (vĩnh viễn) trước đó đã chuyển hướng trang chủ từ www sang không phải www sẽ được trình duyệt lưu vào bộ nhớ cache.
Trước tiên hãy thử nghiệm với lệnh chuyển hướng 302 (tạm thời) để tránh các sự cố tiềm ẩn về bộ nhớ đệm.