.htaccess - cách buộc “www.” một cách chung chung?


102

Điều này sẽ thay đổi domain.comthành www.domain.com:

# Force the "www."
RewriteCond %{HTTP_HOST} !^www\.domain\.com$ [NC]
RewriteRule ^(.*)$ http://www.domain.com/$1 [R=301,L]

Làm cách nào để thay thế phần "miền" để phần này hoạt động trên bất kỳ miền nào?

Câu trả lời:


249

Tôi sẽ sử dụng quy tắc này:

RewriteEngine On
RewriteCond %{HTTP_HOST} !=""
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Điều kiện đầu tiên kiểm tra xem giá trị Máy chủ lưu trữ có trống không (trong trường hợp HTTP / 1.0); thứ hai kiểm tra xem giá trị Máy chủ không bắt đầu bằng www.; kiểm tra thứ ba cho HTTPS ( %{HTTPS}là một trong hai onhoặc off, vì vậy %{HTTPS}slà một trong hai onshoặc offsvà trong trường hợp của onscác slà lần xuất hiện). Phần thay thế RewriteRulesau đó chỉ hợp nhất các phần thông tin thành một URL đầy đủ.


31
Giải pháp này chỉ hoạt động nếu bạn muốn tất cả các miền phụ được chuyển tiếp đến www.yourdomain.com. Nếu bạn chỉ muốn buộc www, bạn nên cập nhật dòng thứ hai là:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky

2
Tôi không nhận được bất kỳ tên miền phụ nào của mình được chuyển tiếp đến www.mydomain.com bằng cách sử dụng quy tắc được đăng trong câu hỏi ...
lol

3
rất thông minh! Tôi thích bạn đã buộc kiểm tra HTTPS để trả về "S" trong nhóm chụp mà bạn đã sử dụng ở dòng sau. rất thanh lịch
code_monk

Có vẻ như một câu trả lời chung, bao gồm HTTP và các giao thức bình thường, hoạt động giống như một sự quyến rũ.
Clain Dsilva

1
Cảm ơn! Tôi sẽ thêm RewriteEngine Ondòng đầu tiên để hoàn thành nó, vì điều này có thể dẫn đến Lỗi máy chủ 500 nếu được sao chép dán nguyên như vậy.
Ryan Casas

44

Điều này sẽ làm điều đó:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

5

Nếu bạn muốn chuyển hướng tất cả các yêu cầu không phải www đến trang web của mình sang phiên bản www, tất cả những gì bạn cần làm là thêm mã sau vào tệp .htaccess của bạn:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

3

Điều này sẽ không hoạt động với các miền phụ.

domain.com được chuyển hướng chính xác đến www.domain.com

nhưng

images.domain.com được chuyển hướng đến www.images.domain.com

Thay vì kiểm tra xem miền phụ có phải là "không phải www" hay không, hãy kiểm tra xem có hai dấu chấm:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Tôi thích giải pháp này. Dù sao để hoàn thành điều tương tự với các TLD như .co.uk?
TylersSN

1
@iUseMagentoNow chỉ tăng các dấu chấm, ví dụ: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Nói đúng ra, TLD của bạn vẫn còn .ukvà tên miền của bạn là something.co.)
mirabilos

.co trong trường hợp này là tên miền cấp hai và không thực sự là một phần của tên miền của bạn khi .uk là TLD mã quốc gia. Thành thật mà nói, đã làm việc trong ngành công nghiệp lưu trữ và nhìn thấy các định dạng mới cho tên miền, tôi không thể thấy các định dạng TLD hiện tại kéo dài cho bất kỳ điều gì khác ngoài mục đích sử dụng chính thức. Chính phủ, tổ chức, v.v. Trong tương lai gần, khi bạn có thể đăng ký fqdn like, fred.bloggs với mức giá tương tự như định mức hiện tại thì web cá nhân sẽ trông rất khác theo quan điểm DNS.
Chris

1

Phần sau sẽ đặt tiền tố 'www' cho bất kỳ yêu cầu nào không có yêu cầu đó và chuyển hướng yêu cầu đã chỉnh sửa đến URI mới.

RewriteCond "%{HTTP_HOST}" "!^www\."         [NC]
RewriteCond "%{HTTP_HOST}" "(.*)"
RewriteRule "(.*)"         "http://www.%1$1" [R=301,L]

1
RewriteEngine On

RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteRule ^ http://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R=301]

Điều này chuyển hướng example.comđến www.example.comloại trừ tên miền phụ.


Đối với tôi điều này dường như được gửi www.example.com để www.www.example.com haha
Albert Renshaw

@Albert Có lẽ điều này là do bộ nhớ cache của trình duyệt của bạn. Xóa bộ nhớ cache của bạn và Thử lại.
Amit Verma

Bạn nói đúng! Tôi vừa chạy ở chế độ ẩn danh (chrome) và nó hoạt động tốt, cảm ơn!
Albert Renshaw

1
Tôi thích quy tắc chung này rất nhiều. Nhưng nó không hoạt động với domain.co.uk vì nó đã có hai dấu chấm trong đó. Làm cách nào để có thể thay đổi quy tắc này để làm cho nó hoạt động tốt cho cả .co.uk?
Sacha Vorbeck

1
Đối với .co.uk và các cctld phụ khác, điều này hoạt động: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Nhưng tiếc là có một số hỗn hợp đã nhập tlds ( wiki.mozilla.org/TLD_List ) như es cho phép domain.es cũng như domain.com.es. Thêm | es vào regex sẽ khớp với domain.es cũng như www.domain.es mà không muốn ở đây. Phải tìm một cách để xử lý này hỗn hợp gõ tiểu ccTLD
Sacha Vorbeck


-1

điều này làm việc như một phép thuật đối với tôi

RewriteCond% {HTTP_HOST} ^ sitename.com [NC] RewriteRule ^ (. *) $ Https://www.sitename.com/ $ 1 [L, R = 301, NC]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.