NGINX kullanarak farklı bir etki alanına nasıl yönlendirilirim?


136

Nasıl yönlendirebilir mydomain.comve herhangi alt alan *.mydomain.comiçin www.adifferentdomain.comNginx kullanarak?

Yanıtlar:


276

server_name , .mydomain.com sözdizimini kullanan sonek eşleşmelerini destekler:

server {
  server_name .mydomain.com;
  rewrite ^ http://www.adifferentdomain.com$request_uri? permanent;
}

veya herhangi bir sürüm 0.9.1 veya üzeri:

server {
  server_name .mydomain.com;
  return 301 http://www.adifferentdomain.com$request_uri;
}

1
Dinlemek için bağlantı noktası koymam gerekmiyor mu? Örneğin, 80 dinleyin. Bir birincil etki alanına yeniden yönlendirmem gereken birden çok etki alanım var, ancak sunucumun çeşitli diğer etki alanları için birden çok sanal sunucusu da var.
Ryan

1
@Ryan listenYönerge belirtilmediğinde varsayılan olarak bağlantı noktası 80'dir. Aslında genel olarak bundan biraz daha karmaşık; bkz nginx yapılandırma dokümanlar Daha fazla ayrıntı için.
Yitz

2
?Sonunda ne başarır ?
Dan Dascalescu

5
Arasındaki fark nedir rewriteve return 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu

6
? yeniden yazmanın sonunda nginx'e orijinal sorgu dizesini eklememesini söyler. Yana $request_urizaten sorgu dizesinin var, tekrar eklenecek gerek yoktur. return 301Sözdizimi yeni ve üzerinde iki yöntem arasındaki davranış fark olmalı, ama ben aslen bu soruyu yanıtladı zaman daha güvenli sözdizimi ile gittik, birçok dağılımları, gerekli sürümünü yoktu.
kolbyjack


15

Mümkünse neden yeniden yazma modülünü kullanasınız return? Teknik olarak, burada okuyabileceğinizreturn gibi yeniden yazma modülünün bir parçasıdır ancak bu pasajın imho'yu okuması daha kolaydır.

server {
    server_name  .domain.com;

    return 302 $scheme://forwarded-domain.com;
}

Ayrıca 301 yönlendirmesi de verebilirsiniz.


1
Bu, yolu ve sorgu parametrelerini de koruyacak mı?
mpen

3
Hayır bu örnek bunu yapmaz @ Mark. Ama sanırım önceki cevapları karıştırıp return 302 $scheme://forwarded-domain.com$request_uri;
şuna

Bir yan not olarak, birçok durumda, düzeni korumak yerine muhtemelen sadece https'ye yönlendirmelisiniz (yani, $ düzeni yerine https kullanın). Bu, protokole bağlı bağlantıların artık kullanımdan kaldırılmış olarak kabul edilmesiyle aynı nedenlerden ötürü - paulirish.com/2010/the-protocol-relative-url
mahemoff

@mahemoff Bu tamamen doğru değil. Web sunucusunun ssl'yi boşaltan bir yük dengeleyicinin arkasında olması durumunu düşünün.
Sebastian Neira

11

Bu, HTTPRewriteModule aracılığıyla çalışmalıdır .

Www.example.com'dan example.com'a yeniden yazma örneği:

server {    
    server_name www.example.com;    
    rewrite ^ http://example.com$request_uri? permanent; 
}

bu yalnızca www.example.com'u example.com'a yönlendiriyor. Her ikisini de farklı bir alana yönlendirmek istiyorum. Bunu tek bir kuralda yapabilir miyim?
deb

Emin değilim, ama sanırım sunucu_adı alanadim.com; www.adifferentdomain.com'u kalıcı olarak yeniden yazın; } yapmalı? Her şeyi * .mydomain.com almalı mı?
udo

@deb sadece sahip olurdunuz server_name example.com www.example.com;.
citruspi

Soru özellikle herhangi bir alt alan adının farklı bir alana yeniden yönlendirilmesini ister . Bu cevap ikisinin hiçbirine cevap vermez (açıkça).
Kissaki

bu önemli 301 eksik!
Sliq

9

"Alan1.com" için istekleri "alan2.com" a yeniden yönlendirmek isterseniz, şuna benzer bir sunucu bloğu oluşturabilirsiniz:

server {
    listen 80;
    server_name domain1.com;
    return 301 $scheme://domain2.com$request_uri;
}

Birinin https: // isteğini de yeniden yönlendirmesi gerekebilir. listen 443;
Rafik Farhad

0

Geçici yeniden yönlendirme

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? redirect;

Kalıcı yönlendirme

rewrite ^ http://www.RedirectToThisDomain.com$request_uri? permanent;

Belirli site için nginx yapılandırma dosyasında:

server {    
    server_name www.example.com;
    rewrite ^ http://www.RedictToThisDomain.com$request_uri? redirect;

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.