.htaccess - cara memaksa "www." dengan cara yang umum?

102

Ini akan berubah domain.commenjadi www.domain.com:

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

Bagaimana cara mengganti bagian "domain" agar dapat berfungsi di domain mana pun ?

StackOverflowNewbie
sumber

Jawaban:

249

Saya akan menggunakan aturan ini:

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]

Kondisi pertama memeriksa apakah nilai Host tidak kosong (dalam kasus HTTP / 1.0); yang kedua memeriksa apakah nilai Host tidak dimulai dengan www.; pemeriksaan ketiga untuk HTTPS ( %{HTTPS}adalah onatau off, begitu %{HTTPS}sjugaons atau offsdan dalam hal onsini scocok). Bagian substitusi RewriteRulekemudian hanya menggabungkan bagian informasi ke URL lengkap.

Gumbo
sumber
31
Solusi ini hanya berfungsi jika Anda ingin semua sub-domain diteruskan ke www.yourdomain.com. Jika Anda hanya ingin memaksa www, Anda harus memperbarui baris kedua menjadi:RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
Jared Pomranky
2
Saya tidak mendapatkan subdomain saya apa pun yang diteruskan ke www.mydomain.com menggunakan aturan yang diposting di pertanyaan ...
lol
3
sangat pintar! Saya suka Anda memaksa pemeriksaan HTTPS untuk mengembalikan "S" dalam grup tangkap, yang Anda gunakan pada baris berikut. sangat elegan
code_monk
Sepertinya jawaban Universal, mencakup HTTP dan protokol normal, berfungsi seperti pesona.
Clain Dsilva
1
Terima kasih! Saya akan menambahkan RewriteEngine Onsebagai baris pertama untuk menyelesaikannya, karena ini dapat menyebabkan 500 Server Error jika disalin-tempel apa adanya.
Ryan Casas
44

Ini akan melakukannya:

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

Jika Anda ingin mengalihkan semua permintaan non-www ke situs Anda ke versi www, yang perlu Anda lakukan hanyalah menambahkan kode berikut ke file .htaccess Anda:

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

Ini tidak akan berfungsi dengan subdomain.

domain.com dengan benar dialihkan ke www.domain.com

tapi

images.domain.com dialihkan ke www.images.domain.com

Daripada memeriksa apakah subdomainnya adalah "bukan www", periksa apakah ada dua titik:

RewriteCond %{HTTP_HOST} ^(.*)$ [NC]
RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ HTTP%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
john mccarthy
sumber
Saya suka solusi ini. Pokoknya untuk mencapai hal yang sama dengan TLD seperti .co.uk?
TylersSN
1
@iUseMagentoNow hanya menambah titik, misalnya: RewriteCond %{HTTP_HOST} !^(.*)\.(.*)\.(.*)\. [NC](Sebenarnya, TLD Anda masih .ukdan domain Anda something.co.)
mirabilos
.co dalam hal ini adalah domain tingkat kedua dan sebenarnya bukan bagian dari domain Anda, sedangkan .uk adalah TLD kode negara. Sejujurnya, setelah bekerja di industri hosting dan melihat format baru untuk nama domain, saya tidak dapat melihat format TLD saat ini bertahan untuk apa pun selain penggunaan resmi. pemerintah, organisasi, dll. Dalam waktu dekat ketika Anda dapat mendaftarkan fqdn like, fred.bloggs dengan harga yang sama dengan norma saat ini, maka web pribadi akan terlihat sangat berbeda dari sudut pandang DNS.
Chris
1

Kalimat berikut ini harus mengawali 'www' ke permintaan apa pun yang tidak memilikinya, dan mengarahkan ulang permintaan yang diedit ke URI baru.

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

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

Ini mengalihkan example.comke www.example.commengecualikan subdomain.

Amit Verma
sumber
Bagi saya ini sepertinya mengirimkan www.example.com ke www.www.example.com haha
Albert Renshaw
@Albert Mungkin ini karena cache browser Anda. Kosongkan tembolok Anda dan Coba lagi.
Amit Verma
Anda benar! Saya baru saja menjalankan penyamaran (chrome) dan berfungsi dengan baik, terima kasih!
Albert Renshaw
1
Saya sangat menyukai aturan umum ini. Tetapi ini tidak berfungsi untuk domain.co.uk karena sudah memiliki dua titik di dalamnya. Bagaimana aturan ini diubah agar berfungsi untuk .co.uk juga?
Sacha Vorbeck
1
Untuk .co.uk dan sub-cctld lainnya, ini berfungsi: ^ ([^.] + \. [^.] +) (\. (Uk | ar | cy | ar | tr))? $ Tapi sayangnya ada beberapa campuran tld yang diketik ( wiki.mozilla.org/TLD_List ) seperti es yang mengizinkan domain.es serta domain.com.es. Menambahkan | es ke regex akan cocok dengan domain.es serta www.domain.es yang tidak diinginkan di sini. Harus menemukan cara untuk menangani sub-cctld jenis campuran ini
Sacha Vorbeck
-1

ini bekerja seperti sihir bagi saya

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

SamYah
sumber