Saya menggunakan nginx di cloud Rackspace mengikuti tutorial dan setelah mencari di internet dan sejauh ini tidak bisa mendapatkan ini diurutkan.
Saya ingin www.mysite.com pergi ke mysite.com seperti biasa dalam .htaccess untuk SEO dan alasan lainnya.
/Etc/nginx/sites-available/www.example.com.vhost konfigurasi saya :
server {
listen 80;
server_name www.example.com example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Saya juga sudah mencoba
server {
listen 80;
server_name example.com;
root /var/www/www.example.com/web;
if ($http_host != "www.example.com") {
rewrite ^ http://example.com$request_uri permanent;
}
Saya juga mencoba. Kedua upaya kedua memberikan kesalahan redirect loop.
if ($host = 'www.example.com' ) {
rewrite ^ http://example.com$uri permanent;
}
DNS saya diset sebagai standar:
site.com 192.192.6.8 A type at 300 seconds
www.site.com 192.192.6.8 A type at 300 seconds
(IP contoh dan folder telah digunakan untuk contoh dan untuk membantu orang di masa depan). Saya menggunakan Ubuntu 11.
Dashboard > Settings > General Settings
dan pastikan tidak adawww
di Alamat WordPress / URL Alamat Situs. Tidak masalah bagaimana Anda mengkonfigurasi nginx Anda, jika Anda memiliki www di URL ini, itu akan diarahkan ke yang memiliki www di dalamnya.Jawaban:
Solusi HTTP
Dari dokumentasi , "cara yang benar adalah mendefinisikan server terpisah untuk example.org":
Solusi HTTPS
Bagi mereka yang menginginkan solusi termasuk
https://
...Catatan: Awalnya saya belum termasuk
https://
dalam solusi saya karena kami menggunakan loadbalancers dan https kami: // server adalah server pembayaran SSL lalu lintas tinggi: kami tidak mencampur https: // dan http: //.Untuk memeriksa versi nginx, gunakan
nginx -v
.Hapus www dari url dengan redirect nginx
Jadi, Anda perlu memiliki dua kode server.
Tambahkan www ke url dengan redirect nginx
Jika yang Anda butuhkan adalah sebaliknya, untuk mengarahkan ulang dari domain.com ke www.domain.com, Anda dapat menggunakan ini:
Seperti yang dapat Anda bayangkan, ini adalah kebalikannya dan bekerja dengan cara yang sama sebagai contoh pertama. Dengan cara ini, Anda tidak mendapatkan nilai SEO turun, karena perm pengalihan lengkap dan bergerak. WWW no terpaksa dan direktori ditampilkan!
Beberapa kode saya ditampilkan di bawah untuk tampilan yang lebih baik:
sumber
return 301 $scheme://domain.com$request_uri;
. Tidak perlu menangkap pola apa pun, lihat perangkap NginxSebenarnya Anda bahkan tidak perlu menulis ulang.
Karena jawaban saya mendapatkan semakin banyak suara tetapi di atas juga. Anda tidak boleh menggunakan a
rewrite
dalam konteks ini. Mengapa? Karena nginx harus memproses dan memulai pencarian. Jika Anda menggunakanreturn
(yang seharusnya tersedia dalam versi nginx) langsung menghentikan eksekusi. Ini lebih disukai dalam konteks apa pun.Alihkan keduanya, non-SSL dan SSL ke mitra non-www mereka:
The
$scheme
variabel hanya akan berisihttp
jika server Anda hanya mendengarkan pada port 80 (default) dan mendengarkan pilihan tidak mengandungssl
kata kunci. Tidak menggunakan variabel tidak akan memberi Anda kinerja apa pun.Perhatikan bahwa Anda memerlukan lebih banyak blok server jika Anda menggunakan HSTS, karena header HSTS tidak boleh dikirim melalui koneksi yang tidak dienkripsi. Oleh karena itu, Anda memerlukan blok server tidak terenkripsi dengan pengalihan dan blok server terenkripsi dengan pengalihan dan header HSTS.
Redirect semuanya ke SSL (konfigurasi pribadi di UNIX dengan IPv4, IPv6, SPDY, ...):
Saya kira Anda dapat membayangkan senyawa lain dengan pola ini sekarang sendiri.
Lebih banyak konfigurasi saya? Buka di sini dan di sini .
sumber
Anda mungkin mengetahui bahwa Anda ingin menggunakan konfigurasi yang sama untuk lebih banyak domain.
Cuplikan berikut menghapus www sebelum domain apa pun:
sumber
http
ke$scheme
return ...
danrewrite ... last
". Adakah tautan yang diperbarui ke masalah kinerja?Anda memerlukan dua blok server.
Masukkan ini ke dalam file konfigurasi Anda, mis
/etc/nginx/sites-available/sitename
Katakanlah Anda memutuskan untuk menggunakan http://example.com sebagai alamat utama yang akan digunakan.
File konfigurasi Anda akan terlihat seperti ini:
Blok server pertama akan menyimpan instruksi untuk mengarahkan permintaan dengan awalan 'www'. Itu mendengarkan permintaan untuk URL dengan awalan 'www' dan pengalihan.
Tidak melakukan apa-apa lagi.
Blok server kedua akan menyimpan alamat utama Anda - URL yang ingin Anda gunakan. Semua pengaturan lainnya pergi di sini seperti
root
,index
,location
, dll Periksa file default untuk ini pengaturan lainnya yang dapat dimasukkan dalam blok server.Server membutuhkan dua catatan DNS A.
Untuk ipv6 buat pasangan rekaman AAAA menggunakan alamat-ipv6 Anda.
sumber
Berikut cara melakukannya untuk beberapa www ke nama server no-www (Saya menggunakan ini untuk subdomain):
sumber
Praktik Terbaik: pisahkan
server
dg hardcodeserver_name
Praktik terbaik dengan nginx adalah menggunakan terpisah
server
untuk pengalihan seperti ini (tidak dibagikan denganserver
konfigurasi utama Anda), untuk meng-hardcode semuanya, dan tidak menggunakan ekspresi reguler sama sekali.Mungkin juga diperlukan untuk melakukan hardcode pada domain jika Anda menggunakan HTTPS, karena Anda harus tahu di muka sertifikat mana yang akan Anda berikan.
Menggunakan Ekspresi Reguler di dalam
server_name
Jika Anda memiliki sejumlah situs, dan tidak peduli dengan kinerja terbaik, tetapi ingin setiap situs memiliki kebijakan yang sama terkait dengan
www.
awalan, maka Anda dapat menggunakan ekspresi reguler. Praktik terbaik untuk menggunakan yang terpisahserver
masih akan berlaku.Perhatikan bahwa solusi ini menjadi rumit jika Anda menggunakan https, karena Anda harus memiliki satu sertifikat untuk mencakup semua nama domain Anda jika Anda ingin ini berfungsi dengan baik.
non-
www
kewww
/ regex dalam satu khususserver
untuk semua situs:www
ke non-www
w / regex dalam satu khususserver
untuk semua situs:www
untuk non-www
/ regex di khususserver
untuk beberapa situs saja:Mungkin perlu untuk membatasi regex untuk hanya mencakup beberapa domain, maka Anda dapat menggunakan sesuatu seperti ini hanya untuk mencocokkan
www.example.org
,www.example.com
danwww.subdomain.example.net
:Menguji Ekspresi Reguler dengan nginx
Anda dapat menguji apakah regex berfungsi seperti yang diharapkan
pcretest
pada sistem Anda, yang merupakanpcre
pustaka yang sama persis dengan yang akan digunakan nginx Anda untuk ekspresi reguler:Perhatikan bahwa Anda tidak perlu khawatir tentang trailing dots atau case, karena nginx sudah mengatasinya, seperti nginx nama server regex ketika header "Host" memiliki trailing dot .
Taburkan
if
dalam yang adaserver
/ HTTPS:Solusi akhir ini umumnya tidak dianggap sebagai praktik terbaik, namun tetap berfungsi dan berfungsi.
Bahkan, jika Anda menggunakan HTTPS, maka solusi akhir ini mungkin lebih mudah dikelola, karena Anda tidak perlu menyalin-menempelkan sejumlah arahan ssl di antara
server
definisi yang berbeda , dan sebagai gantinya dapat menempatkan cuplikan hanya ke dalam server yang dibutuhkan, membuatnya lebih mudah untuk debug dan memelihara situs Anda.tanpa
www
kewww
:www
untuk non-www
:hardcoding domain pilihan tunggal
Jika Anda ingin sedikit lebih banyak kinerja, dan juga konsistensi antara beberapa domain yang
server
dapat digunakan tunggal , mungkin masih masuk akal untuk secara eksplisit melakukan hardcode satu domain yang disukai:Referensi:
sumber
Solusi ini berasal dari pengalaman pribadi saya. Kami menggunakan beberapa ember Amazon S3 dan satu server untuk mengarahkan ulang
non-www
kewww
nama domain agar sesuai dengan kebijakan header "Host" S3 .Saya menggunakan konfigurasi berikut untuk server nginx :
Ini cocok dengan semua nama domain yang menunjuk ke server dimulai dengan apa pun kecuali
www.
dan dialihkan kewww.<domain>
. Dengan cara yang sama Anda dapat melakukan redirect berlawanan dariwww
kenon-www
.sumber
listen 80
Anda perlu menambahkanlisten 443 ssl
dan kemudianssl_certificate
danssl_certificate_key
arahan.listen 443 ssl
dengan sertifikat hilang. Itu tidak akan berhasil dan menyebabkan beberapa sakit kepala serius.Saya menggabungkan yang terbaik dari semua jawaban sederhana, tanpa domain kode keras.
301 redirect permanen dari non-www ke www (HTTP atau HTTPS):
Jika Anda lebih suka non-HTTPS, non-www ke HTTPS, www redirect secara bersamaan:
sumber
Alihkan non-www ke www
Untuk Domain Tunggal:
Untuk Semua Domain:
Redirect www ke non-www Untuk Domain Tunggal:
Untuk Semua Domain:
sumber
80
dan443
?listen
arahan untuk saya (nginx 1.4.6).coba ini
Cara lain: Nginx no-www ke www
dan www ke no-www
sumber
Format unik:
sumber
server {
server_name "~^www\.(.*)$" ;
return 301 $scheme://$1$request_uri ;
}
sumber
$scheme://www.domain.com$1
untuk menghindari double slashtidak yakin apakah ada yang memperhatikan mungkin mengembalikan 301 tetapi browser mencekiknya
lebih cepat dari:
sumber
Blog hantu
untuk membuat metode yang direkomendasikan nginx dengan
return 301 $scheme://example.com$request_uri;
bekerja dengan Ghost Anda perlu menambahkan di blok server utama Anda:sumber
Jika Anda tidak ingin mengubah kode nama domain, Anda dapat menggunakan blok pengalihan ini. Domain tanpa www utama disimpan sebagai variabel
$domain
yang dapat digunakan kembali dalam pernyataan pengalihan.REF: Mengarahkan ulang subdomain dengan ekspresi reguler di nginx
sumber
sumber
Jika Anda mengalami masalah agar ini berfungsi, Anda mungkin perlu menambahkan alamat IP server Anda. Sebagai contoh:
di mana XXX.XXX.XXX.XXX adalah alamat IP (jelas).
Catatan: ssl crt dan lokasi utama harus ditentukan untuk mengarahkan ulang permintaan https dengan benar
Jangan lupa untuk me-restart nginx setelah melakukan perubahan:
sumber
/etc/init.d/nginx reload
Anda juga dapatreload
server yang tidak menyebabkan downtime.