Arahkan non-www ke www di .htaccess

189

Saya memilikinya di file .htaccess saya:

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

tetapi setiap kali saya mengakses file di root saya seperti http://example.com/robots.txtitu akan dialihkan ke http://www.example.comrobots.txt/.

Bagaimana saya bisa memperbaiki ini sehingga akan mengarahkan ulang dengan benar http://www.example.com/robots.txt?

Paul Sanchez
sumber

Jawaban:

391

Ubah konfigurasi Anda ke ini (tambahkan garis miring):

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

Atau solusi yang diuraikan di bawah ini (diusulkan oleh @absiddiqueLive ) akan berfungsi untuk domain apa pun:

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

Jika Anda perlu mendukung http dan https dan mempertahankan pilihan protokol coba yang berikut ini:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Di mana Anda mengganti logindengan checkout.phpatau URL apa pun yang Anda perlukan untuk mendukung HTTPS.

Saya berpendapat ini adalah ide yang buruk. Untuk alasannya silakan baca jawaban ini .

Randall Hunt
sumber
Solusi ini tidak berfungsi ketika beberapa halaman (seperti login atau mendaftar) menggunakan protokol https.
Alexey Kosov
Saya sedikit memperbarui posting untuk memasukkan beberapa info. Sulit untuk secara umum dan benar memilih protokol yang akan digunakan.
Randall Hunt
3
Solusi pertama tidak cukup redirect, yang ke-2 sepertinya terlalu banyak redirect. Misalnya blog.example.commenjadiwww.blog.example.com
gman
Bisakah Anda juga menambahkan cara menghindari pengalihan saat mengembangkan di localhost?
Bugs Bunny
Saya sudah mengikuti semuanya di sini tapi tidak ada yang berhasil. Saya menggunakan pengaturan laravel. Adakah yang tahu mengapa ini tidak berhasil untuk saya? www.domain.com dan domain.com memuat dengan benar tetapi domain.com tidak mengalihkan ke www.domain.com. Mungkinkah ini masalah dengan DNS saya?
Halo dunia
93

Inilah solusi yang benar yang mendukung https dan http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Alexey Kosov
sumber
7
Ini sempurna, itu juga tidak mengarahkan subdomain wwwseperti solusi generik lainnya.
Fabian Schmengler
4
Ini adalah solusi terbaik, bekerja jauh lebih baik daripada jawaban yang diterima, dan merawat HTTPS dengan benar
Tamik Soziev
3
Bekerja dengan sempurna! Dan dalam beberapa baris seperti itu!
zeckdude
8
INI ADALAH JAWABAN TERBAIK
Andrew
8
Jika saya tidak salah, ini tidak akan berhasil lebih dari satu titik. Contoh:yoursite.co.uk
TrashyMcTrash
83
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Untuk Https

RewriteCond %{HTTPS}s ^on(s)|

RewriteRule ^(.*)$ http%1://www.%{HTTP_HOST}/$1 [R=301,L]
absiddique hidup
sumber
8
Solusi ini lebih disukai daripada @ ranman karena akan bekerja untuk semua domain sehingga meminimalkan kesalahan manusia baik ketika Anda menerapkan kode untuk proyek baru atau ketika Anda menerapkan domain ekstra untuk proyek yang sudah ada.
Frankie
Saya lebih suka solusi ini, tetapi mengapa ^(.*)$bukan (.*)?
Popnoodles
solusi ini lebih baik tetapi saya telah mengedit milikku untuk mengandung milikmu juga.
Randall Hunt
1
Ini berfungsi untuk semua domain, sederhana dan efektif! Terima kasih
eirenaios
Anda dapat mengikuti RewriteCond% {HTTPS} s ^ on (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive
24

Contoh berikut ini berfungsi pada kedua ssl dan non-ssl dan jauh lebih cepat karena Anda hanya menggunakan satu aturan untuk mengelola http dan https

RewriteEngine on


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

[Diuji]

Ini akan mengarahkan ulang

http

untuk

https

untuk

Amit Verma
sumber
1
Sangat dekat dengan apa yang saya pikirkan. Mendukung lebih dari satu titik di host HTTP juga, misalnya "mysite.co.uk".
Adambean
2
Karena penasaran, mengapa Anda tidak menggunakan R = 301 di sini? Ini akan menggunakan 302 (temp temp.) Secara default jika tidak ada kode yang ditentukan.
Marc
1
Bekerja dengan sempurna. Ini harus menjadi jawaban yang diterima.
James Nisbet
8

Coba ini, saya menggunakannya di banyak situs web, ini bekerja dengan sempurna

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]
Ali Aboussebaba
sumber
4

Saya telah menguji semua solusi di atas tetapi tidak bekerja untuk saya, saya telah mencoba untuk menghapus http: // dan tidak akan mengalihkan juga menghapus www itu redirect dengan baik, jadi saya bingung, khususnya saya menjalankan semua situs saya di bawah https : //

Jadi saya telah menggabungkan beberapa kode bersama dan menghasilkan solusi sempurna untuk http: // dan https: // dan www dan non-www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Semoga ini bisa membantu seseorang :)

Game Mizo
sumber
3

Konfigurasi ini bekerja untuk saya di bitnami wordpress dengan SSL yang dikonfigurasi:

Ditambahkan di bawah ini di bawah "RewriteEngine On" di file /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Abhilash Mishra
sumber
2
RewriteCond %{HTTP_HOST} !^www\.domain\.com [NC]
RewriteRule (.*) http://www.domain.com/$1 [L,R=301]

Ini akan mengarahkan ulang domain Anda yang tidak dimulai dengan WWW. Ini bukan mengarahkan ulang semua sub domain Anda.

Ini bermanfaat.

Ashish Gondaliya
sumber
2

Saya yakin jawaban teratas berhasil mengalihkan non-www ke www (mis: mysite.com -> www.mysite.com ), tetapi tidak memperhitungkan subdomain wildcard, yang menghasilkan:

random.mysite.com -> www.random.mysite.com

Inilah solusi dengan / tanpa HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* catatan: Saya belum menguji https karena saat ini saya tidak memiliki sertifikat untuk diuji, tetapi jika seseorang dapat memverifikasi atau mengoptimalkan apa yang saya miliki, itu akan luar biasa.

Hunter Frazier
sumber
Apa yang $ pertama lakukan di sini: '^ (. *) $'
Vaishal Patel
0

Jika memungkinkan, tambahkan ini ke file konfigurasi Apache utama. Ini adalah solusi yang lebih ringan, lebih sedikit pemrosesan yang dibutuhkan.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Jadi, yang terpisah VirtualHostuntuk "example.com" menangkap permintaan itu dan kemudian mengarahkannya secara permanen ke utama AndaVirtualHost . Jadi tidak ada REGEX parsing dengan setiap permintaan, dan browser klien Anda akan melakukan cache redirect sehingga mereka tidak akan pernah (atau jarang) meminta url "salah" lagi, menghemat Anda pada server load.

Catatan, garis miring di Redirect permanent / http://www.example.com/. Tanpa itu, redirect dari example.com/asdfakan diarahkan ke http://www.example.comasdfalih-alih http://www.example.com/asdf.

Butkus Buttle
sumber
0

Dua peringatan

Hindari 301 dan lebih suka kode status respons 303 atau 307 modern.

Hindari 301

Pikirkan baik-baik jika Anda benar-benar membutuhkan pengalihan permanen yang ditunjukkan sebagai [R=301] karena jika Anda memutuskan untuk mengubahnya nanti, maka pengunjung halaman sebelumnya akan terus melihat halaman pengalihan asli.

Informasi pengalihan permanen sering disimpan dalam cache browser dan, secara umum, sulit untuk dihilangkan (memuat ulang halaman tidak menyelesaikan masalah). Pengunjung situs web Anda akan terjebak dalam pengalihan sebelumnya "selamanya".

Hindari 302 juga

Versi baru protokol HTTP (v1.1) menambahkan dua kode status respons baru yang dapat digunakan alih-alih 302.

  • 303 Pengalihan URL tetapi menuntut untuk mengubah jenis permintaan menjadi GET.
  • 307 Pengalihan URL tetapi menuntut untuk menjaga jenis permintaan seperti yang awalnya dikirim.

Anda masih dapat menggunakan kode 302(pengalihan non-permanen) meskipun dianggap ambigu. Bagaimanapun, sebagian besar browser mengimplementasikan 302dengan cara yang sama seperti yang 303diinstruksikan kode baru .

ePi272314
sumber
tentang peringatan Anda tentang 301, ini akan berlaku bahkan jika kita berbicara tentang nama domain yang sama? tidak yakin bagaimana ini akan berlaku dalam hal ini ... mengarahkan semua URL dari http://example.com/testingke http://www.example.com/testing. Bisa jadi pendekatan yang buruk dalam jangka panjang? Terima kasih,
Sara_
-1

Tulis di .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Piseth Sok
sumber
1
Sama seperti jawaban lainnya
Ankit