Htaccess generik mengalihkan www ke non-www

484

Saya ingin mengalihkan www.example.comke example.com. Kode htaccess berikut membuat ini terjadi:

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

Tapi, apakah ada cara untuk melakukan ini secara umum tanpa hardcoding nama domain?

deepwell
sumber
64
Penting untuk diketahui bahwa jika Anda tidak menggunakan www (atau subdomain lain) maka semua cookie akan dikirimkan ke setiap subdomain dan Anda tidak akan dapat memiliki subdomain tanpa cookie untuk menyajikan konten statis sehingga mengurangi jumlah data yang dikirim bolak-balik antara browser dan server. Sesuatu yang mungkin kemudian Anda sesali: twitter.com/codinghorror/statuses/1637428313
Sam Hasler
3
Hal lain yang perlu dipertimbangkan, pastikan Anda menetapkan nama kanonik tanpa www di halaman Anda, untuk menghindari kemungkinan hukuman duplikat konten. Juga jika Anda memiliki url absolut di tautan Anda, pastikan semuanya juga bukan www.
Jeremy Morgan
Menurut pendapat saya lebih baik menyimpan pengalihan eksplisit, terutama ketika menyalin konfigurasi untuk domain lain, yang mungkin memerlukan penyetelan berbeda (domain www lebih baik dalam beberapa kasus) weboptimizer.ch/2014/01/redirection-www
snowflake
Adakah alasan mengapa solusi ini akan bekerja untuk semua kasus kecuali url root? Misalnya domain.com tidak piont untuk domain.com , sedangkan domain.com/page1 melakukan redirect ke domain.com/page1 .
Jeff Solomon
Jika Anda ingin mengarahkan www ke non-www sambil mempertahankan protokol (HTTP atau HTTPS), maka lihat pertanyaan terkait ini: Mengarahkan www ke non-www sambil mempertahankan protokol HTTP atau HTTPS
MrWhite

Jawaban:

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

Sama seperti Michael kecuali yang ini berfungsi: P

Volomike
sumber
16
Jika tidak berhasil, Anda mungkin kehilangan RewriteEngine Onprekursor untuk membuatnya berfungsi.
hendry
8
@ Ben, bagaimana saya menggunakan ini secara terbalik, untuk menambahkan www ke situs web non-www?
anarkhos
18
Itu dialihkan http://www.domain.com/ke http://domain.com//. Anda harus menambahkan /ke RewruteRule. Ini bekerja untuk saya RewriteRule ^/(.*)$ http://%1/$1 [R=301,L].
Vladimir Prudnikov
13
Saya mengalami masalah yang sama dengan Vladimir dengan mengarahkannya ke http://domain.com//dengan garis miring ganda. Jadi saya lakukan RewriteRule ^(.*)$ http://%1$1 [R=301,L] dan tampaknya bekerja sejauh ini
bobfet1
5
Silakan gunakan solusi berikut daripada menulis ulang mesin, itu jauh lebih cepat sementara menjadi elegan: stackoverflow.com/questions/1100343/...
Birla
111

Tetapi jika kita perlu melakukan ini untuk http dan https yang terpisah:

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
Andron
sumber
2
www.example.com/ pengalihan ke example.com// Ada cara untuk menghapus garis miring tambahan?
Bobby S
Pertanyaan bagus. Saya kira solusi cepatnya adalah dengan menggunakan aturan tambahan (yaitu hanya untuk kasus ini) sebelum dijelaskan di atas. Misalnya: RewriteCond %{HTTPS} off RewriteCond %{HTTP_HOST} ^www.example.com/$ [NC] RewriteRule ^(.*)$ http://www.example.com [R=301,L] ...
Andron
3
@ BobbyS Saya menggunakan solusi dalam artikel ini . Ini mengalihkan www dan HTTP ke HTTPS non-www dan juga menangani trailing /.
totymedli
Anda hanya akan mendapatkan garis miring tambahan (di awal jalur URL), jika Anda menempatkan arahan ini langsung di konfigurasi server (atau virtualhost). Dalam .htaccessAnda tidak harus mendapatkan garis miring ekstra. (Hanya untuk dicatat, jika Anda melakukan pengalihan ini di konfigurasi server maka Anda mungkin tidak boleh menggunakan mod_rewrite untuk memulai dengan ... mod_alias sederhana Redirectdalam wadah vhost yang sesuai akan lebih efisien dan lebih rentan kesalahan.)
MrWhite
72

Alihkan non-www ke www (keduanya: http + https)

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\.(.*)$ [NC]
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
Dmitriy
sumber
4
@nightcoder Ini karena solusi saya untuk pengalihan terbalik (dari non-www ke www) sebagai lawan dari Andron's
Dmitriy
2
Catatan: solusi ini dapat menyebabkan beberapa masalah jika Anda bermaksud menggunakan nama subdomain untuk tujuan lain. Misalnya, app.domainanda.com akan dialihkan ke www.app.domainanda.com.
Marty ZHANG
1
Ini adalah kebalikan dari jawaban untuk pertanyaan itu.
John
Saya harus menambahkan RewriteEngine Ondan RewriteBase /, tetapi jika tidak berfungsi dengan baik.
overthink
45

Jika Anda ingin melakukan ini di file httpd.conf, Anda dapat melakukannya tanpa mod_rewrite (dan tampaknya lebih baik untuk kinerja).

<VirtualHost *>
  ServerName www.example.com
  Redirect 301 / http://example.com/
</VirtualHost>

Saya mendapatkan jawaban itu di sini: /server/120488/redirect-url-within-apache-virtualhost/120507#120507

William Denniss
sumber
33

Berikut adalah aturan untuk mengarahkan URL www ke no-www:

#########################
# redirect www to no-www
#########################

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

Berikut adalah aturan untuk mengalihkan URL no-www ke www:

#########################
# redirect no-www to www
#########################

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

Perhatikan bahwa saya menggunakan NEflag untuk mencegah apache keluar dari string kueri. Tanpa tanda ini, apache akan mengubah URL yang diminta http://www.example.com/?foo%20barmenjadihttp://www.example.com/?foo%2250bar

Salman A
sumber
1
dapatkah Anda menulis kode untuk mengalihkan http ke https bersama dengan mengarahkan ulang www ke non-www
HYDER ALI
Ubah http: // menjadi https: // untuk memaksanya ke HTTPS saat itu berubah. Anda juga ingin menambahkan pengalihan http-> https reguler untuk lalu lintas yang tidak diarahkan oleh aturan ini.
diamondsea
11
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^/(.*)$ https://%1/$1 [R]

The RewriteCondmenangkap segala sesuatu di HTTP_HOSTvariabel setelah itu www.dan menyimpannya di%1 .

The RewriteRulemenangkap URL tanpa terkemuka /dan menyimpannya di $1.

Michael Cramer
sumber
1
sans leading "/"- Dalam .htaccess(seperti yang dinyatakan dalam pertanyaan) tidak ada arahan /, sehingga polanya tidak pernah cocok dan arahan tidak pernah terjadi. (Hanya ada garis miring utama dalam konteks server atau virtualhost .) Juga, jika Anda memiliki arahan mod_rewrite setelah ini, maka Anda akan memerlukan Lbenderanya.
MrWhite
7

Coba ini:

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

Jika host dimulai dengan www, kami menempelkan seluruh host pada awal URL, lalu melepas "www."

Greg
sumber
1
RoBorg, sayangnya pengaturan Anda tidak berfungsi, jika saya mencoba ini: example.com/hello/world Saya berakhir di sini: example.com/hello/world/world Saya juga harus menambahkan garis miring setelah% {HTTP_POST} di RewriteRule Pertama
deepwell
2
Saya menggunakan Apache / 2.2.9 (Unix). Ini berfungsi untuk situs web, yang mengalihkan ke situs web Tetapi untuk yang berikut: situs web / tes -> masuk ke: websitetest Saya memperbaiki ini dengan menambahkan kesalahan lain / Kedua: situs web / tes / n pergi ke websitetest / n / n
deepwell
1
Masalah yang sama dengan @deepwell dengan yang ini.
neemzy
Masalah yang dimiliki pembaca sebelumnya adalah karena arahan ini ditujukan untuk konfigurasi server (atau vhost), bukan .htaccess. Dalam konteks direktori ( .htaccess) Anda harus mengubah yang pertama RewriteRuledibaca: RewriteRule ^(.*)$ %{HTTP_HOST}/$1 [C,DPI](memerlukan Apache 2.2.12+). Perhatikan penambahan tanda garis miring dan DPI(Buang Info Path) - untuk mencegah bagian dari URL-path yang tampaknya digandakan (yang sebenarnya "path-info") seperti yang dinyatakan dalam komentar sebelumnya. Namun, ada arahan yang lebih sederhana - sebagaimana dibahas dalam jawaban lain.
MrWhite
7

Handler WWW Lengkap, http / https

Saya tidak melihat jawaban yang lengkap. Saya menggunakan ini untuk menangani inklusi WWW.

  1. Umum. Tidak memerlukan info domain.
  2. Memaksa WWW di domain utama: www.domain.com
  3. Menghapus WWW di subdomain: sub.domain.com
  4. Mempertahankan status HTTP / HTTPS.
  5. Mengizinkan kuki terpisah untuk domain / sub-domain

Tolong beri tahu saya cara kerjanya atau jika saya meninggalkan celah.

RewriteEngine On
RewriteBase /

# Force WWW. when no subdomain in host
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$ [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# Remove WWW. when subdomain(s) in host     
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|off [NC]
RewriteCond http%1://%{HTTP_HOST} ^(https?://)(www\.)(.+\.)(.+\.)(.+)$ [NC]
RewriteRule ^ %1%3%4%5%{REQUEST_URI} [R=301,L]
Gregor Macgregor
sumber
Pertanyaan asli meminta untuk diarahkan wwwke non- www. Anda memaksakan dimasukkannya www.
Vadim
6

Mungkin ada banyak informasi yang salah di luar sana tentang pengalihan htaccess, saya menemukan. Pertama, pastikan situs Anda berjalan di Unix menggunakan Apache dan bukan pada host Windows jika Anda mengharapkan kode ini berfungsi.

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]

RewriteRule ^(.*)$ http://%1/$1 [R=301,L] 

(Namun, pastikan tidak ada spasi baris di antara setiap baris teks; Saya telah menambahkan spasi ekstra di antara baris-baris tersebut sehingga tidak masalah di jendela ini.)

Ini adalah satu cuplikan kode yang dapat digunakan untuk mengarahkan versi www situs Anda ke versi http: //. Ada kode serupa lainnya yang dapat digunakan juga.

Pengalihan Htaccess
sumber
3
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/subfolder/$1 [R=301,L]

Untuk subfolder

pelajar
sumber
3

Bagi mereka yang perlu dapat mengakses seluruh situs TANPA awalan 'www'.

RewriteCond %{HTTP_HOST} ^www\.(.+)$ [NC]
RewriteRule ^ http%{ENV:protossl}://%1%{REQUEST_URI} [L,R=301]

Mare yakin Anda menambahkan ini ke file berikut

/site/location/.htaccess 
Rick
sumber
Contoh ini tidak lengkap - Anda tidak mengatur protosslvariabel lingkungan (ini bukan variabel standar / server). Ini akan selalu kosong, jadi akan selalu dialihkan ke http. (Gagasan di balik pengaturan protosslsebelumnya dalam kode adalah untuk ketika Anda ingin mempertahankan protokol saat mengarahkan. Namun, hari ini Anda mungkin harus mengarahkan ulang ke httpssetiap saat.)
MrWhite
3

Menggunakan .htaccess untuk Redirect ke www atau non-www:

Cukup masukkan baris kode berikut ke dalam file root .htaccess utama Anda. Dalam kedua kasus, cukup ganti domain.com ke nama host Anda sendiri.

Redirect ke www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^domain\.com [NC]
  RewriteRule ^(.*)$ http://wwwDOTdomainDOtcom/$1 [L,R=301]
</IfModule>

Redirect ke non-www

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{HTTP_HOST} ^www\.domain\.com [NC]
  RewriteRule ^(.*)$ http://domainDOTcom/$1 [L,R=301]
</IfModule>

ubah DOT ke =>. !!!

Rohallah Hatami
sumber
2

Saya menggunakan aturan di atas untuk menemukan www tanpa www dan berfungsi dengan baik untuk beranda, namun pada halaman internal mereka meneruskan ke /index.php

Saya menemukan aturan lain ini dalam file .htaccess saya yang menyebabkan ini tetapi tidak yakin apa yang harus dilakukan. Setiap saran akan sangat bagus:

############################################
## always send 404 on missing files in these folders

    RewriteCond %{REQUEST_URI} !^/(media|skin|js)/

############################################
## never rewrite for existing files, directories and links

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-l

############################################
## rewrite everything else to index.php

    RewriteRule .* index.php [L]
Luke
sumber
Anda harus menempatkan aturan pengalihan non-www sebelum yang Anda kutip.
Vladimir Jovanović
2

www ke non www dengan https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
Rajith Ramachandran
sumber
2
RewriteEngine on
# if host value starts with "www."
RewriteCond %{HTTP_HOST} ^www\.
# redirect the request to "non-www"
RewriteRule ^ http://example.com%{REQUEST_URI} [NE,L,R]

Jika Anda ingin menghapus wwwkeduanya httpdan https, gunakan yang berikut ini:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.
RewriteCond %{HTTPS}s ^on(s)|offs
RewriteRule ^ http%1://example.com%{REQUEST_URI} [NE,L,R]

Ini mengalihkan Non ssl

untuk

Dan SSL

untuk

pada apache 2.4.*Anda dapat melakukannya dengan menggunakan Redirectdengan ifdirektif,

<if "%{HTTP_HOST} =='www.example.com'">
Redirect / http://example.com/
</if>
starkeen
sumber
2

gunakan: Javascript / jQuery

// similar behavior as an HTTP redirect
window.location.replace("http://www.stackoverflow.com");
// similar behavior as clicking on a link
window.location.href = "http://stackoverflow.com";

Atau .htaccess:

RewriteEngine On
RewriteBase /
Rewritecond %{HTTP_HOST} ^www\.yoursite\.com$ [NC]
RewriteRule ^(.*)$ https://yoursite.com/$1 [R=301,L]

dan Metode PHP:

$protocol = (@$_SERVER["HTTPS"]    == "on") ? "https://" : "http://";

if (substr($_SERVER['HTTP_HOST'], 0, 4) !== 'www.') {
    header('Location: '.$protocol.'www.'.$_SERVER    ['HTTP_HOST'].'/'.$_SERVER['REQUEST_URI']);
    exit;
}

Ajax

$.ajax({
    type: "POST",
    url: reqUrl,
    data: reqBody,
    dataType: "json",
    success: function(data, textStatus) {
        if (data.redirect) {
            // data.redirect contains the string URL to redirect to
            window.location.href = data.redirect;
        }
        else {
            // data.form contains the HTML for the replacement form
            $("#myform").replaceWith(data.form);
        }
    }
});
program anti-program
sumber
1

Satu-satunya cara saya membuatnya bekerja ...

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

Jika Anda memaksa www. di url atau memaksa ssl prototcol, kemudian coba gunakan kemungkinan variasi dalam file htaccess, seperti:

Tulis Ulang Hidup
RewriteBase /

### Angkatan WWW ###

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

## Angkatan SSL ###

RewriteCond% {SERVER_PORT} 80 
RewriteRule ^ (. *) $ Https://example.com/$1 [R, L]

## Blokir IP ###
Pesanan Ditolak, Bolehkan
Tolak dari 256.251.0.139
Tolak dari 199.127.0.259
mistik
sumber
Apache dapat mendengarkan port lain, mis. 81. Jadi alih-alih RewriteCond %{SERVER_PORT} 80saya menyarankan untuk menggunakan pemeriksaan yang lebih universal:RewriteCond %{HTTPS} off
Andron
1

Jawaban yang dipilih dan banyak solusi lain di sini menjatuhkan bagian url setelah /, jadi pada dasarnya selalu diarahkan ke domain utama, setidaknya untuk saya .. Jadi saya menambahkan sampel yang bekerja dengan menghormati jalur penuh setelah slash ..

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

Pendekatan alternatif jika kustomisasi .htaccess bukanlah opsi yang ideal:

Saya telah membuat server pengalihan sederhana untuk penggunaan umum. Cukup tambahkan catatan A atau CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Info lebih lanjut: https://simpleredirect.net

Bobik
sumber
0

Saya tidak yakin mengapa Anda ingin menghapus www. Tetapi versi sebaliknya adalah:

# non-www.* -> www.*, if subdomain exist, wont work
RewriteCond %{HTTP_HOST} ^whattimein\.com
RewriteRule ^(.*)$ http://www.whattimein.com/$1 [R=permanent,L]

Dan keuntungan dari skrip ini adalah: jika Anda memiliki sesuatu seperti test.whattimein.com atau lainnya (lingkungan untuk pengembangan / pengujian), ia tidak akan mengarahkan Anda ke lingkungan asli.

lokal
sumber
2
Apakah subdomain www harus dimasukkan atau tidak benar-benar masalah preferensi pribadi dan dapat bergantung pada nama domain dan target audiens. Kode generik yang diposting di atas untuk mengarahkan www ke none-www juga menangani lingkungan pengujian OK, karena pengalihan hanya terjadi ketika "www." subdomain ditemukan.
MrWhite
1
Pertanyaan ini berlawanan dengan apa yang ditanyakan pengguna, yang hanya mencemari pos.
Vadim
0

Ini diperbarui untuk berfungsi di Apache 2.4:

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

Satu-satunya perubahan vs Michael adalah menghapus [NC], yang menghasilkan kesalahan "AH00665":

Opsi NoCase untuk pola non-regex '-f' tidak didukung dan akan diabaikan

William Entriken
sumber
Jawaban sebelumnya tidak perlu "memperbarui untuk berfungsi di Apache 2.4". "Peringatan" yang Anda kutip (AH00665) berhubungan dengan arahan yang berbeda (misalnya jika Anda memiliki sesuatu seperti RewriteCond %{REQUEST_FILENAME} !-f [NC]). The NCflag membuat sedikit perbedaan di atas, namun, alasan NCbendera harus digunakan di sini adalah untuk menangkap sebagian kecil dari lalu lintas bot yang (benar) mengirimkan nama host huruf besar.
MrWhite
0

Ditambahkan jika localhost, abaikan pengalihan (untuk tujuan pengembangan di lingkungan lokal). Jika bukan localhost DAN (bukan https ATAU ini www), arahkan ulang ke https dan non-www.

RewriteEngine On

RewriteBase /
RewriteCond %{HTTP_HOST} !localhost [NC]
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]
Jeaf Gilbert
sumber
Tolong uraikan kode Anda sehingga OP memahami bagaimana ini menjawab pertanyaan.
RyanNerd
-2

Hai, Anda dapat menggunakan aturan berikut pada file htaccess Anda:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^example.com
RewriteRule (.*) http://www.example.com/$1 [R=301,L]
Chirag Parekh
sumber
Pertanyaannya adalah meminta solusi "generik" yang tidak menyertakan nama domain. Solusi Anda juga melakukan kebalikan dari apa yang ditanyakan dalam pertanyaan (non-www ke www, bukan www ke non-www) tanpa penjelasan.
MrWhite