nginx server_name wildcard หรือ catch-all


119

ฉันมีตัวอย่างของ nginx ที่ทำงานซึ่งให้บริการหลายเว็บไซต์ ข้อความแรกคือข้อความสถานะบนที่อยู่ IP ของเซิร์ฟเวอร์ admin.domain.comประการที่สองคือคอนโซลผู้ดูแลระบบบน เหล่านี้ทำงานได้ดี ตอนนี้ฉันต้องการให้คำขอโดเมนอื่น ๆ ไปที่รายการเดียวindex.php- ฉันมีโดเมนและโดเมนย่อยมากมายและไม่สามารถแสดงรายการทั้งหมดในการกำหนดค่า nginx ได้

จนถึงตอนนี้ฉันได้ลองตั้งค่าserver_nameไปแล้ว*แต่ล้มเหลวเนื่องจากสัญลักษณ์แทนไม่ถูกต้อง *.*ใช้งานได้จนกว่าฉันจะเพิ่มบล็อกเซิร์ฟเวอร์อื่นจากนั้นฉันเดาว่ามันขัดแย้งกับพวกเขา

มีวิธีเรียกใช้บล็อกเซิร์ฟเวอร์ catch-all ใน nginx หลังจากกำหนดไซต์อื่นแล้วหรือไม่

หมายเหตุฉันไม่ใช่สแปมเมอร์ไซต์เหล่านี้เป็นไซต์ของแท้ที่มีเนื้อหาที่เป็นประโยชน์เพียงแค่ขับเคลื่อนโดย CMS เดียวกันจากฐานข้อมูล!


1
ดีที่สุดในการใช้นี้เป็นแหล่งที่มาหลักnginx.org/en/docs/http/server_names.html
สตีเฟ่น

คำตอบ:


147

เปลี่ยนตัวเลือกฟังเป็นสิ่งนี้ในบล็อกเซิร์ฟเวอร์ที่รับทั้งหมดของคุณ (เพิ่มdefault_server) สิ่งนี้จะใช้การเชื่อมต่อที่ไม่ได้กำหนดทั้งหมดของคุณ (บนพอร์ตที่ระบุ)

listen       80  default_server;

หากคุณต้องการส่งทุกอย่างไปที่ index.php หากไม่มีไฟล์หรือโฟลเดอร์

try_files                       $uri /$uri /index.php;

ทำงานได้อย่างสมบูรณ์ - ขอบคุณมาก ฉันไม่สามารถใช้server_name _;สำหรับหน้าสถานะบนที่อยู่ IP ฉันต้องระบุserver_name x.x.x.xแต่ไม่เป็นไร!
ตาก

1
การเพิ่มdefault_serverดูเหมือนจะไม่ทำงานบน nginx 1.4.6 ซึ่งปัจจุบันเป็นเวอร์ชันล่าสุดบน Ubuntu 14.04 ... เมื่อฉันเพิ่มconfigtestคำสั่งจะส่งคืนข้อผิดพลาดและการรีสตาร์ทเซิร์ฟเวอร์ก็ไม่ทำงานเช่นกัน ฉันได้ลองใช้การกำหนดค่าเดียวกันบนเซิร์ฟเวอร์ของฉันด้วย Debian jessie ซึ่งมี nginx 1.6.2 และทำงานได้อย่างสมบูรณ์ ลองใช้เวอร์ชันอื่นถ้าคุณใช้ 1.4.6 ...
Nicomak

1
หมายเหตุด้านข้างสำหรับ HTTPS: default_serverคำสั่งยังตั้งค่าเซิร์ฟเวอร์ที่จะจัดการ SSL handshake สำหรับคำขอบนพอร์ตนั้น ดังนั้นหากคุณต้องการให้เซิร์ฟเวอร์บล็อก A จัดการ SSL แต่เซิร์ฟเวอร์ B ทำหน้าที่เป็นตัวรับสัญญาณสำหรับ HTTPS วิธีแก้ปัญหาคือตั้งค่าserver_name ~^(.+)$บนเซิร์ฟเวอร์ B
ลุค

66

ขีดล่างง่ายๆก็ใช้ได้เช่นกัน:

server_name  _;

ที่มา: http://nginx.org/en/docs/http/server_names.html


2
แม้ว่าลิงก์นี้อาจตอบคำถามได้ แต่ควรรวมส่วนสำคัญของคำตอบไว้ที่นี่และระบุลิงก์เพื่อการอ้างอิง คำตอบแบบลิงก์เท่านั้นอาจไม่ถูกต้องหากหน้าที่เชื่อมโยงเปลี่ยนไป
Kmeixner

10
ลิงค์มีไว้เพื่อเป็นข้อมูลอ้างอิงเท่านั้น สองบรรทัดข้างต้นเป็นคำตอบจริง ๆ : การใส่ขีดล่างเป็นค่าสำหรับ server_name จะทำให้เกิดพฤติกรรม "catch all" ที่ต้องการ
jp.gouigoux

55
คำตอบนี้ไม่เป็นความจริง การอ้างอิงทำให้ชัดเจนว่าสิ่งนี้จะใช้ไม่ได้เว้นแต่คุณจะมีlisten 80 default_serverใน config ของคุณด้วย
Beetle

5
ดูบทความนี้ด้วย
Beetle

2
บางทีฉันอาจเข้าใจเอกสารผิด แต่ "ไม่มีอะไรพิเศษเกี่ยวกับชื่อนี้มันเป็นเพียงชื่อโดเมนที่ไม่ถูกต้องมากมายซึ่งไม่เคยตัดกับชื่อจริงใด ๆ ชื่อที่ไม่ถูกต้องอื่น ๆ เช่น“ -” และ“! @ #” อาจ ใช้อย่างเท่าเทียมกัน ". ดังนั้น_เป็นเพียงที่ไม่ถูกต้องชื่อ?
Florian Klein

26

สิ่งนี้จะได้ผล:

server_name ~^(.+)$

13
server_name ~.ดูเหมือนจะมีประสิทธิภาพมากขึ้น
youfu

2
สิ่งนี้ได้ผลสำหรับฉัน ด้วยเหตุผลใดก็ตามที่ฉันไม่สามารถใช้ default_server ได้มันกำลังลบล้าง vhosts อื่น ๆ ของฉันทั้งหมด
NeuroXc

11

สำหรับฉันแล้วการกำหนด default_server ไม่ทำงาน ฉันแก้ไขโดย

server_name ~^.*$

โดยใช้นิพจน์ทั่วไปของทั้งหมด


ลองใช้ตัวเลือกที่ได้รับการโหวตสูงกว่าทั้งหมดและนี่เป็นตัวเลือกเดียวที่ได้ผล หมายเหตุ: ฉันกำลังพยายามไปยังเซิร์ฟเวอร์ที่มีที่อยู่ IP เทียบกับ URL
Mampersat

9

เพียง 1 serverคำสั่ง

จากNginx listenDocs

พารามิเตอร์ default_server หากมีอยู่จะทำให้เซิร์ฟเวอร์กลายเป็นเซิร์ฟเวอร์ดีฟอลต์สำหรับแอดเดรสที่ระบุ: คู่พอร์ต หากไม่มีคำสั่งใดที่มีพารามิเตอร์ default_server เซิร์ฟเวอร์แรกที่มีแอดเดรส: คู่พอร์ตจะเป็นเซิร์ฟเวอร์เริ่มต้นสำหรับคู่นี้

หากคุณมีเพียง 1 serverคำสั่งที่จะจัดการคำขอทั้งหมดคุณไม่จำเป็นต้องตั้งค่าอะไร


หลายserverคำสั่ง

หากคุณต้องการจับคู่คำขอทั้งหมดกับserverคำสั่งที่ระบุเพียงเพิ่มdefault_serverพารามิเตอร์เข้าไปlistenNginx จะใช้serverคำสั่งนี้เป็นค่าเริ่มต้น

server {
    listen 80 default_server;
}

เกี่ยวกับ server_name _;

จากNginx Docs

ในตัวอย่างเซิร์ฟเวอร์ catch-all ชื่อแปลก ๆ “ _” สามารถเห็นได้:

server {
    listen       80  default_server;
    server_name  _;
    return       444;
}

ไม่มีอะไรพิเศษเกี่ยวกับชื่อนี้เป็นเพียงหนึ่งในชื่อโดเมนที่ไม่ถูกต้องมากมายซึ่งไม่เคยตัดกับชื่อจริงใด ๆ อาจใช้ชื่ออื่นที่ไม่ถูกต้องเช่น“ -” และ“! @ #” เท่า ๆ กัน

มันไม่สำคัญว่าสิ่งที่server_nameคุณตั้งค่าก็เป็นเพียงชื่อโดเมนที่ไม่ถูกต้อง



2

หากคุณต้องการจับคำขอที่มีHostส่วนหัวว่าง(ซึ่งได้รับอนุญาตในHTTP / 1.0 ) คุณสามารถใช้ได้ทั้ง regex และ empty server_name:

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