redirect apache dari non www ke www


206

Saya memiliki situs web yang tampaknya tidak mengalihkan dari non-www ke www.

Konfigurasi Apache saya adalah sebagai berikut:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Apa yang saya lewatkan?


1
Untuk .htaccesssolusi berbasis saya sarankan jawaban yang telah diajukan pada pertanyaan diametral: stackoverflow.com/a/5262044/367456
hakre

ini bagus, itu memang menambahkan garis miring ke url, jadi kehilangan garis miring sebelum dolar.
wuxmedia

Jawaban:


510

Menggunakan mesin penulisan ulang adalah cara yang cukup berat untuk menyelesaikan masalah ini. Berikut ini adalah solusi yang lebih sederhana:

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

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

Dan kemudian Anda akan memiliki <VirtualHost>bagian lain dengan ServerName www.example.comuntuk konfigurasi server nyata Anda. Apache secara otomatis menyimpan apa pun setelah /menggunakan Redirectdirektif , yang merupakan kesalahpahaman umum tentang mengapa metode ini tidak bekerja (padahal sebenarnya itu berhasil).


20
Bagaimana Anda melakukannya untuk situs yang juga memiliki host virtual ssl?
Shabbyrobe

28
Saya mendapatkan kesalahan "Halaman web di example.com telah menghasilkan terlalu banyak pengalihan" saat menggunakan saran ini. Apakah orang lain memiliki masalah ini?
Jonathan Berger

4
@ BlackDivine: Tidak ada yang ajaib tentang melakukannya di arah lain. Cukup bertukar www.exampledan di examplemana pun mereka muncul dalam sampel.
Greg Hewgill

11
@ JonathanBerger Jika Anda terlalu banyak pengalihan, maka Anda mungkin tidak mengkonfigurasi dengan baik file tersebut. Pastikan untuk memiliki 2 VirtualHosts: satu dengan non-www yang di atas dan yang lainnya dengan ServerName www.example.com yang memiliki konfigurasi sebenarnya. Pastikan juga tidak ada pengalihan dalam konfigurasi www.example.com juga (baik mod_alias dan mod_rewrite).
Savas Vedova

3
Untuk server host virtual, katakan example.com, saya punya Redirect 301 / http://example2.com/extra/tetapi ketika dialihkan, ia melewatkan garis miring, yang berarti example.com/blahpergi ke example2.com/extrablah. Ada ide? (Apache 2.2.22)
Peter Howe

88

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

3
jawaban yang sangat singkat ... tetapi langsung ... tidak yakin apakah ini suara yang naik atau turun
thecoshman

2
Oh itu rapi, ini dapat dimasukkan dalam konfigurasi server di tingkat atas (dan jika demikian) akan berlaku untuk setiap host virtual!
thenickdude

Halo @burzumko bagaimana Anda mencapai hal ini, yang berlaku untuk semua tanpa www, tapi kemudian biarkan, katakan example.com/subdi1/ws/* melalui tanpa www?
black sensei

1
Saya menggunakan solusi ini untuk host virtual HTTPS juga. Tambahkan saja ske http di baris ketiga.
rodrigoap

46
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Ini tidak berhasil untuk saya; itu menyebabkan loop pengalihan tak terbatas ke situs yang sama
dmiller309

1
@ dmiller309: Apakah Anda termasuk www.di dalamnya ServerAlias?
cherouvim

2
Anda benar, saya tidak sengaja memasukkan www. di ServerAlias ​​menggunakan *. wildcard. Karena saya mengacaukan urutan entri VirtualHost, *. wildcard memiliki kesempatan untuk mencocokkan ketika saya tidak berpikir itu akan cocok.
dmiller309

7
Ini adalah jawaban terbaik, karena itu bersih, tetap jalan (tidak seperti jawaban # 1) dan tidak menggunakan Menulis ulang.
schieferstapel

30

Untuk menghapus wwwdari URLsitus web Anda, gunakan kode ini dalam .htaccessfile Anda :

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

Untuk memaksa wwwsitus web Anda, URLgunakan kode ini di.htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Di mana YourSite.comharus diganti dengan Anda URL.


Jawaban terbaik di sini, karena berfungsi untuk situs web dengan beberapa nama domain <3
Clement Herreman

2
Apa bagian kedua dengan .html untuk ??
Nathan H

6
Hapus slash sebelum $ 1 untuk tidak memiliki double slash (//) setelah redirect => RewriteRule ^ (. *) $ YourSite.com $ 1 [R = 301]
Kevin Campion

22
    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

Inilah yang terjadi dengan kode di atas. Blok host virtual pertama memeriksa apakah permintaannya adalah www.example.com dan menjalankan situs web Anda di direktori itu.

Gagal yang mana, ia datang ke bagian virtual host kedua. Di sini selain dari www.example.com dialihkan ke www.example.com.

Urutan di sini penting. Jika Anda menambahkan direktif virtualhost kedua terlebih dahulu, itu akan menyebabkan pengalihan loop.

Solusi ini akan mengalihkan permintaan apa pun ke domain Anda, ke www.domainanda.com.

Bersulang!


16

Ini mirip dengan banyak saran lainnya dengan beberapa peningkatan:

  • Tidak perlu melakukan hardcode pada domain (bekerja dengan vhosts yang menerima banyak domain atau antar lingkungan)
  • Pertahankan skema (http / https) dan abaikan efek dari %{REQUEST_URI}aturan sebelumnya .
  • Bagian path tidak terpengaruh oleh RewriteRuleseperti sebelumnya %{REQUEST_URI}adalah.

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

4
Hampir sempurna. Itu harus% {HTTP_HOST} $ 1, bukan% {HTTP_HOST} / $ 1 (atau itu akan menggandakan garis miring)
Michael Wyraz

@Michael Wyraz: Tidak menggandakan tebasan di sini ?!
not2savvy

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

Ini dimulai dengan HTTP_HOSTvariabel, yang hanya berisi bagian nama domain dari URL yang masuk ( example.com). Dengan asumsi nama domain tidak mengandung www.dan cocok dengan nama domain Anda dengan tepat, maka RewriteRule ikut berperan. Pola ^(.*)$akan cocok dengan semua yang ada di REQUEST_URI, yang merupakan sumber daya yang diminta dalam permintaan HTTP ( foo/blah/index.html). Ini menyimpan ini dalam referensi kembali, yang kemudian digunakan untuk menulis ulang URL dengan nama domain baru (yang dimulai dengan www).

[NC]menunjukkan pencocokan pola case-insensitive, [R=301]menunjukkan redirect eksternal menggunakan kode 301 (sumber daya dipindahkan secara permanen), dan [L]menghentikan semua penulisan ulang lebih lanjut, dan mengarahkan ulang segera.


6

Kode pengalihan untuk non-www => www dan sebaliknya www => non-www. Tidak ada domain dan skema hardcoding dalam file .htaccess. Jadi domain asal dan versi http / https akan dipertahankan.

APACHE 2.4 DAN BARU

NON-WWW => WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW => NON-WWW:

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

Catatan: tidak berfungsi di Apache 2.2 di mana% {REQUEST_SCHEME} tidak tersedia. Untuk kompatibilitas dengan Apache 2.2 gunakan kode di bawah ini atau ganti% {REQUEST_SCHEME} dengan http / https tetap.


APACHE 2.2 DAN BARU

NON-WWW => WWW:

RewriteEngine On

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

RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

... atau versi yang lebih pendek ...

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

WWW => NON-WWW:

RewriteEngine On

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

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

... versi yang lebih pendek tidak dimungkinkan karena% N hanya tersedia dari RewriteCond terakhir ...


Konfigurasi Apache 2.4 memperbaiki masalah, terima kasih atas jawaban bersihnya .. !!
KimchiMan

5

Saya menjalankan ini ...

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

Saya ingin ini menjadi universal untuk 25+ domain di server baru kami, jadi arahan ini ada di file virtual.conf saya dalam tag <Directory>. (dir adalah induk dari semua dokumen)

Saya harus melakukan sedikit hack pada aturan penulisan ulang, karena dokumen lengkap sedang dilakukan pada pertandingan pola, terlepas dari apa yang http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html kata tentang hal itu hanya menjadi barang setelah host dan port.


5

Jika Anda menggunakan Apache 2.4, tanpa perlu mengaktifkan modul apache menulis ulang, Anda dapat menggunakan sesuatu seperti ini:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

1
Jawaban yang diremehkan. Menggunakan ini, vhosts tambahan dapat dihindari yang bagus untuk skrip Let'sEncrypt otomatis.
Paul

Plus, jika Anda menggunakan ANSIBLE, karena ANSIBLE 2.0 sekarang Anda dapat dengan mudah memasukkan blok ke dalam satu tugas, lebih detail di sini docs.ansible.com/ansible/2.5/modules/blockinfile_module.html
sys0dm1n

3

Redirect domain.tld ke www.

Baris berikut dapat ditambahkan dalam arahan Apache atau dalam file .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Sudomain lainnya masih berfungsi.
  • Tidak perlu menyesuaikan garis. cukup salin / tempel di tempat yang tepat.

Jangan lupa untuk menerapkan perubahan apache jika Anda memodifikasi vhost.

(berdasarkan Drupal7 .htaccess default tetapi harus berfungsi dalam banyak kasus)


3

Ini sederhana!

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

2
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Ini tidak hanya akan mengarahkan ulang nama domain tetapi juga halaman dalam.seperti ...

example.com/abcd.html                ==>     www.example.com/abcd.html
example.com/ab/cd.html?ef=gh    ==>    www.example.com/ab/cd.html?ef=gh


Terima kasih untuk ini. Sangat membantu.
Anthony

2

Coba ini:

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

2

Jangan selalu gunakan Redirect permanent(atau mengapa itu dapat menyebabkan masalah di masa depan)

Jika ada kemungkinan Anda akan menambahkan subdomain nanti, jangan gunakan redirect permanent.

Karena jika klien telah menggunakan subdomain yang tidak terdaftar karena VirtualHostia mungkin juga tidak pernah mencapai subdomain ini bahkan ketika terdaftar kemudian.

redirect permanentmengirimkan HTTP 301 Moved Permanentlyke klien (browser) dan banyak dari mereka menyimpan tanggapan ini selamanya (sampai cache dihapus [secara manual]). Jadi menggunakan subdomain itu akan selalu di-autoredirect ke www. *** tanpa meminta server lagi.

lihat Berapa lama cache browser HTTP 301s?

Jadi gunakan saja Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - Kapan tidak menggunakan mod_rewrite

Apache.org - Nama Host Canonical


1

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

periksa karya sempurna ini


1

-Jika Anda meng-host beberapa nama domain (Opsional)

-Jika semua nama domain menggunakan https (sebagaimana mestinya)

-Jika Anda ingin semua nama domain menggunakan www dot domainName

Ini akan menghindari pengalihan doble (http: // non www ke http: // www dan kemudian ke https: // www)

<VirtualHost *:80>
RewriteEngine On
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^(.*)$ https://www.%1$1 [R=301,L]
</VirtualHost>

Dan

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

Anda harus mengubah kode redirection 301 ke yang paling nyaman


0

Saya hanya punya masalah yang sama. Tetapi dipecahkan dengan ini

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

Aturan ini mengarahkan non-www ke www.

Dan aturan ini untuk mengarahkan ulang www ke non-www

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

Rujuk dari http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/


0

Ini bekerja untuk saya:

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

Saya menggunakan pola lihat-depan (?!www.domain.com)untuk mengecualikan wwwsubdomain ketika mengarahkan semua domain ke wwwsubdomain untuk menghindari loop redirect tak terbatas di Apache.


0

Kode yang saya gunakan adalah:

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

-1

Jika menggunakan solusi di atas dari dua <VirtualHost *:80>blok dengan ServerName...

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

... maka Anda harus mengatur NameVirtualHost Onjuga .

Jika Anda tidak melakukan ini, Apache tidak membiarkan dirinya menggunakan ServerNames yang berbeda untuk membedakan blok, sehingga Anda mendapatkan pesan kesalahan ini:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

... dan tidak ada redirection yang terjadi, atau Anda memiliki loop redirection tak terbatas, tergantung pada blok mana yang Anda tempatkan terlebih dahulu.


-1

Saya punya tugas serupa pada WP Multisite, di mana aturan redirection harus generik (untuk domain tertentu yang saya tambahkan ke jaringan). Saya memecahkan terlebih dahulu menambahkan wildcard ke domain (domain parkir). Perhatikan. setelah .com.

CNAME * domain.com.

Dan kemudian saya menambahkan baris-baris berikut ke file .htaccess di root multisite saya. Saya kira itu akan berhasil untuk situs mana pun.

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

Semoga ini bisa membantu.

ps. Jika Anda ingin mengalihkan dari bukan www ke www, ubah baris terakhir menjadi

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

-2

Saya merasa lebih mudah (dan lebih bermanfaat) untuk menggunakan ServerAlias ​​saat menggunakan beberapa vhosts.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Ini juga berfungsi dengan https vhosts.


Drive-by downvote lainnya. Peduli untuk menjelaskan, oh dewa dewa httpd yang tidak bisa diganggu untuk menjelaskan downvote?
Anthony

1
Ini membuatnya agar Anda memiliki beberapa domain yang meng-hosting situs yang sama. Tergantung pada situasi Anda dan apa yang dijalankan server web Anda, Anda akan memiliki masalah dengan cookie yang tidak terbawa, orang-orang bingung, dan masalah mesin pencari (yang akan melihat ini sebagai 2 situs yang berbeda).
Jeffrey Van Alstine
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.