RewriteCond tắt %{HTTPS} [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule (.*) https://www.example.com%{REQUEST_URI} [R=301,L]
Bạn chưa nêu chính xác điều gì đang xảy ra hoặc nơi các tên miền phụ đang trỏ đến, vì vậy có thể có các vấn đề khác ở đây.
Tuy nhiên, nếu tên miền phụ của bạn trỏ đến cùng một khu vực của hệ thống tệp (hoặc có thể là thư mục con) làm tên miền chính thì quy tắc trên sẽ chuyển hướng tất cả tên miền phụ đến www.example.com
- vì vậy tên miền phụ bị "mất".
Tùy thuộc vào yêu cầu của bạn, bạn có thể giải quyết vấn đề này bằng cách chỉ kiểm tra ví dụ.com
thay vì !^www\.
và tách chuyển hướng HTTP sang HTTPS thành quy tắc riêng. Ví dụ:
# HTTP sang HTTPS (bao gồm cả tên miền phụ)
Viết lại Cond %{HTTPS} tắt
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Chuyển hướng không phải www sang www theo chuẩn Canonical chỉ dành cho tên miền chính
RewriteCond %{HTTP_HOST} ^(example\.com)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
Bạn sẽ cần xóa bộ nhớ cache của trình duyệt trước khi thử nghiệm. (Tốt nhất nên thử nghiệm với chuyển hướng 302 - tạm thời - để tránh các sự cố tiềm ẩn về bộ nhớ đệm.)
Tuy nhiên, các lệnh cũng sai thứ tự (điều này không liên quan gì đến vấn đề tên miền phụ). Các chuyển hướng chính tắc (ở trên) cần phải đi trước nội bộ viết lại. Vậy bạn .htaccess
thay vào đó, tệp nên được sắp xếp như thế này:
Chỉ mụcBỏ qua *
Viết LạiEngine Trên
viết lại cơ sở /
# HTTP sang HTTPS (bao gồm cả tên miền phụ)
Viết lại Cond %{HTTPS} tắt
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# Chuyển hướng không phải www sang www theo chuẩn Canonical chỉ dành cho tên miền chính
RewriteCond %{HTTP_HOST} ^(example\.com)\.?$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [R=301,L]
# Xóa phần mở rộng ".php" trên URL được yêu cầu
RewriteCond %{THE_REQUEST} \s/(.+)\.php[\s?] [NC]
RewriteRule ^ /%1 [R=301,L,NE]
# Yêu cầu viết lại nội bộ để thêm phần mở rộng ".php"
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^(.+?)/?$ $1.php [L]