Score:0

Nginx - ฉันจะบังคับให้โดเมนเซิร์ฟเวอร์และบล็อกเซิร์ฟเวอร์ทั้งหมดใช้การเปลี่ยนเส้นทางที่ไม่ใช่ www ได้อย่างไร

ธง de

มีผลลัพธ์ที่ดีมากมายเกี่ยวกับวิธีเปลี่ยนเส้นทาง "www" เป็น "ไม่มี www" และในทางกลับกัน

มากที่สุด วิธีแก้ไขที่แนะนำคือนี่:

เซิร์ฟเวอร์ {
    ฟัง 80;
    server_name www.example.com;
    ส่งคืน 301 https://example.com$request_uri;
}

วิธีนี้ใช้ได้ดีกับไฟล์กำหนดค่าเว็บไซต์ไฟล์เดียว อย่างไรก็ตาม การกำหนดค่าซ้ำอย่างรวดเร็วเมื่อคุณมีหลายเว็บไซต์ภายใต้เซิร์ฟเวอร์ Nginx เดียว

ฉันต้องการหลีกเลี่ยงการทำการกำหนดค่าซ้ำกับบริการที่ฉันกำลังทำอยู่...

ดังนั้นวิธีแก้ปัญหาของฉันในการจับโดเมน www.[anything.com] ทั้งหมดมีลักษณะดังนี้:

เซิร์ฟเวอร์ {
    ฟัง 80;
    ส่งคืน 301 https://$host$request_uri;
}

อย่างไรก็ตาม ฉันเชื่อว่า $โฮสต์ ตัวแปรยังคงมี "www" อยู่ภายใน (ซึ่งสมเหตุสมผล)

ฉันพยายามทดสอบสิ่งนี้ด้วยการกำหนดค่าปัจจุบันของฉัน ดังนั้นเพื่อประหยัดเวลา ใครที่มีประสบการณ์ Nginx มากกว่านี้ช่วยชี้ฉันไปในทิศทางที่ถูกต้องนอกเหนือจากจุดนี้ได้ไหม

ขอขอบคุณสำหรับเวลาของคุณ!

Score:2
ธง us

คุณสามารถใช้วิธีการต่อไปนี้:

เซิร์ฟเวอร์ {
    ฟัง 80;
    server_name ~^(?:www\.)(.*)$;

    ส่งคืน 301 https://$1$request_uri;
}

นิพจน์ทั่วไปจับส่วนหลัง www. ถึง $1 ตัวแปรซึ่งจะใช้ใน กลับ คำแถลง.

https://nginx.org/r/server_name อธิบายรายละเอียดเพิ่มเติมว่า nginx ตัดสินใจอย่างไร เซิร์ฟเวอร์ บล็อกที่จะใช้

Michael Hampton avatar
cz flag
และอย่าลืมใส่บล็อก 'เซิร์ฟเวอร์' ssl พร้อมใบรับรองที่เหมาะสม
Matthew Spence avatar
de flag
มันทรงพลังมาก ขอบคุณ! ฉันจะทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้องสำหรับคำถามนี้ อย่างไรก็ตามฉันสงสัยว่ามีวิธีแก้ปัญหาที่ไม่ใช่ regex เพื่อปรับปรุงประสิทธิภาพหรือไม่
us flag
ไม่มี เพราะคุณต้องแยกชื่อโฮสต์บางส่วน และ regex เป็นวิธีเดียวที่จะทำได้
Score:0
ธง sv

ยินดีต้อนรับสู่ ServerFault

ในขณะที่สิ่งที่ Tero Kilkanen ตอบคือแนวคิดหลัก ดีกว่า วิธีการทำเช่นเดียวกันมีอยู่แล้วในเอกสารอย่างเป็นทางการที่ https://nginx.org/r/server_name และที่ https://nginx.org/en/docs/http/server_names.html.

เซิร์ฟเวอร์ {
    server_name ~^www\.(?<baredomain>.+)$;
    ส่งคืน 301 https://$baredomain$request_uri;
}

ซึ่งใช้วิธีที่เรียกว่า "Named Captures" ขณะประเมินนิพจน์ทั่วไป "การจับชื่อ" สามารถใช้ไวยากรณ์ใด ๆ ต่อไปนี้...

?<ชื่อ> ไวยากรณ์ที่เข้ากันได้กับ Perl 5.10 รองรับตั้งแต่ PCRE-7.0
?'ชื่อ' ไวยากรณ์ที่เข้ากันได้กับ Perl 5.10 รองรับตั้งแต่ PCRE-7.0
?P<ชื่อ> ไวยากรณ์ที่เข้ากันได้กับ Python รองรับตั้งแต่ PCRE-4.0
Score:0
ธง ar
เซิร์ฟเวอร์ { 

         server_name example.com; 

         ส่งคืน 301 https://www.example.com$request_uri; 

}

ตามค่าเริ่มต้น หากคุณละเว้นคำสั่งนี้ nginx จะถือว่าคุณต้องการฟังที่พอร์ต 80

นี่คือเอกสาร ของพฤติกรรมเริ่มต้นนี้

นี่คือการกำหนดค่าที่สมบูรณ์สำหรับ default-ssl.conf ของคุณ

เซิร์ฟเวอร์ {

 ฟัง 443 ssl;

 server_name example.com; 

ssl_certificate /srv/www/example.com/keys/ssl.crt; 

ssl_certificate_key /srv/www/example.com/keys/www.example.com.key; 

ส่งคืน 301 https://www.example.com$request_uri; 

}

คุณสามารถแทนที่ ssl บน; คำสั่งพร้อมฟัง 443 ssl; ตามคำแนะนำจาก เอกสาร nginx

Matthew Spence avatar
de flag
ขอบคุณสำหรับคำตอบ. น่าเสียดายที่สิ่งนี้ไม่ได้ช่วยในการสร้างโซลูชัน "catch all" ดังนั้นคุณจึงไม่จำเป็นต้องเขียนการกำหนดค่าตามโดเมน (เช่นเดียวกับที่คุณทำกับของคุณที่นี่ใช้ได้กับ `example.com` เท่านั้น ไม่ใช่ `example-2 ด้วย คอม`)

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา