จะเปลี่ยนเส้นทางไปยังโดเมนอื่นโดยใช้ NGINX ได้อย่างไร


139

ฉันจะเปลี่ยนเส้นทางmydomain.comและโดเมนย่อย*.mydomain.comไปwww.adifferentdomain.comใช้ NGINX ได้อย่างไร

คำตอบ:


280

server_nameรองรับการจับคู่คำต่อท้ายโดยใช้ไวยากรณ์. mydomain.com:

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

หรือในเวอร์ชัน 0.9.1 หรือสูงกว่า:

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

1
ฉันไม่จำเป็นต้องใส่พอร์ตเพื่อฟังหรือไม่? เช่นฟัง 80 ฉันมีหลายโดเมนที่ต้องเปลี่ยนเส้นทางไปยังโดเมนหลัก แต่เซิร์ฟเวอร์ของฉันยังมีเซิร์ฟเวอร์เสมือนหลายตัวสำหรับโดเมนอื่น ๆ
Ryan

1
@Ryan listenคำสั่งเริ่มต้นเป็นพอร์ต 80 เมื่อไม่ได้ระบุ จริงๆแล้วมันซับซ้อนกว่านั้นเล็กน้อย ดูเอกสารการกำหนดค่า nginxสำหรับรายละเอียดเพิ่มเติม
Yitz

2
ความ?สำเร็จในตอนท้ายคืออะไร?
Dan Dascalescu

5
อะไรคือความแตกต่างระหว่างrewriteและreturn 301 $scheme://www.adifferentdomain.com$request_uri;?
Dan Dascalescu

6
เดอะ? ในตอนท้ายของการเขียนซ้ำจะบอกให้ nginx ไม่ต้องต่อท้ายสตริงการสืบค้นเดิม เนื่องจาก$request_uriมีสตริงคำค้นหาอยู่แล้วจึงไม่จำเป็นต้องต่อท้ายอีก return 301ไวยากรณ์ใหม่และควรจะมีความแตกต่างในการทำงานระหว่างสองวิธีไม่มี แต่เมื่อฉันเดิมตอบคำถามนี้กระจายมากไม่ได้มีรุ่นที่จำเป็นเพื่อให้ฉันไปกับไวยากรณ์ที่ปลอดภัย
kolbyjack


15

ทำไมต้องใช้โมดูลการเขียนซ้ำถ้าคุณทำได้return? ในทางเทคนิคแล้วreturnเป็นส่วนหนึ่งของโมดูลการเขียนซ้ำที่คุณสามารถอ่านได้ที่นี่แต่ตัวอย่างนี้อ่านง่ายกว่า imho

server {
    server_name  .domain.com;

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

คุณยังสามารถเปลี่ยนเส้นทาง 301 ได้


1
สิ่งนี้จะเก็บเส้นทางและพารามิเตอร์การสืบค้นด้วยหรือไม่
mpen

3
ไม่มีตัวอย่างนี้ไม่ทำ @Mark แต่ฉันคิดว่าคุณสามารถผสมคำตอบก่อนหน้านี้เพื่อให้ได้สิ่งนี้:return 302 $scheme://forwarded-domain.com$request_uri;
Robin van Baalen

โปรดทราบว่าในหลาย ๆ กรณีคุณควรเปลี่ยนเส้นทางไปยัง https แทนที่จะรักษาแบบแผนไว้ (เช่นใช้ https แทน $ แบบแผน) นี่เป็นเหตุผลเดียวกันกับลิงก์ที่เกี่ยวข้องกับโปรโตคอลจึงถูกพิจารณาว่าเลิกใช้แล้ว - paulirish.com/2010/the-protocol-relative-url
mahemoff

@mahemoff นั่นไม่เป็นความจริงทั้งหมด พิจารณากรณีที่มีเว็บเซิร์ฟเวอร์อยู่หลังตัวโหลดบาลานซ์ที่ปล่อย ssl
Sebastian Neira

11

ว่าควรจะทำงานผ่านHTTPRewriteModule

ตัวอย่างการเขียนซ้ำจาก www.example.com เป็น example.com:

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

นั่นเป็นเพียงการเปลี่ยนเส้นทาง www.example.com ไปที่ example.com ฉันต้องการเปลี่ยนเส้นทางทั้งสองไปยังโดเมนอื่น ฉันสามารถทำได้ในกฎข้อเดียวหรือไม่?
เดบ

ฉันไม่ทราบแน่ชัด แต่ฉันคิดว่า server_name mydomain.com; เขียน www.adifferentdomain.com ใหม่ถาวร } ควรทำอย่างไร ที่ควรใช้ทุกอย่าง * .mydomain.com?
udo

@deb server_name example.com www.example.com;คุณก็จะต้อง
citruspi

คำถามที่ถามโดยเฉพาะสำหรับโดเมนย่อยใด ๆที่จะเปลี่ยนเส้นทางไปที่ที่แตกต่างกันโดเมน คำตอบนี้ไม่มีคำตอบใด ๆ เลย (อย่างชัดเจน)
Kissaki

นี่ขาด 301 ที่สำคัญ!
Sliq

10

หากคุณต้องการเปลี่ยนเส้นทางคำขอสำหรับ "domain1.com" ไปยัง "domain2.com" คุณสามารถสร้างบล็อกเซิร์ฟเวอร์ที่มีลักษณะดังนี้:

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

บางคนอาจต้องเปลี่ยนเส้นทาง https: // ขอด้วย listen 443;
Rafik Farhad

1

คุณสามารถเขียน if condition ภายในเซิร์ฟเวอร์ {} block:

server { 

    if ($host = mydomain.com) {
        return 301 http://www.adifferentdomain.com;
    } 
}

คุณต้องระมัดระวังในการใช้คำสั่ง 'if' บน Nginx ( nginx.com/resources/wiki/start/topics/depth/ifisevil ) ในกรณีนี้คุณสามารถใช้ 'server_name mydomain.com' แทนได้
Marty

หากเป็นสิ่งชั่วร้ายเมื่อใช้ในบริบทตำแหน่งจะปลอดภัยเมื่อใช้เพื่อระบุโฮสต์การเปลี่ยนเส้นทาง
cryptoK ™

0

เปลี่ยนเส้นทางชั่วคราว

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

เปลี่ยนเส้นทางถาวร

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

ในไฟล์คอนฟิกูเรชัน nginx สำหรับไซต์เฉพาะ:

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

}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.