Nginx: การจับคู่ชื่อโฮสต์เซิร์ฟเวอร์ในคำสั่งตำแหน่งที่ตั้ง


18

ฉันมี nginx ที่รันหลายโดเมนภายใต้คำสั่งเซิร์ฟเวอร์เดียวเป็น

server {
        listen       80;
        server_name  www.domain.com;
        server_name  x.domain.com;
        server_name  y.domain.com;

----
----
----
}

ตอนนี้ฉันต้องใช้คำสั่งตำแหน่งเพื่อจับคู่โดเมนย่อยและใช้การรับรองความถูกต้องขั้นพื้นฐานกับมัน มีค่าเท่ากับ

location x.domain.com {
        auth_basic "Admin Login";
        auth_basic_user_file /etc/nginx/.htpasswd;
}

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


16

คุณสามารถใช้นิพจน์ทั่วไปเพื่อจับภาพโดเมนย่อยจากนั้นใช้ในภายหลังในตำแหน่งของคุณ

server {
    server_name   ~^(?<sub>\.)?(?<domain>.+)$;

    location / {
        root   /sites/$sub;
    }
}

หรืออาจเป็นการดีกว่าที่จะย้ายการกำหนดค่าทั่วไปทั้งหมดไปยังไฟล์อื่นแล้วสร้างเซิร์ฟเวอร์บล็อกต่อโดเมนย่อยและรวมไฟล์ภายนอกไว้ด้วย

server {
        server_name  www.domain.com;
        include /etc/nginx/sites-enabled/default.inc;

    location / {
        ... 
    } 
}

(ทำซ้ำสำหรับเซิร์ฟเวอร์อื่น ๆ )


ฉันทำอะไรบางอย่างขาดหายไปหรือว่าชื่อเซิร์ฟเวอร์ขาดหายไป?และ<>? ฉันเชื่อว่ามันควรจะเป็นserver_name ~^(?<sub>\.)?(?<domain>.+)$;
โมฮัมหมัด AbuShady

คุณอาจจะถูกต้อง - ฉันไม่สามารถคิดได้ว่ามีเหตุผลอะไรที่ทำให้มันเป็นอย่างที่เป็นอยู่ในขณะนี้ดังนั้นฉันจึงเปลี่ยนเป็นคำแนะนำของคุณ
cyberx86

6

ทางเลือกหนึ่งคือการส่งคืนข้อผิดพลาดและส่งข้อผิดพลาดนั้นไปยังตำแหน่งที่จัดการการตรวจสอบความถูกต้อง HTTP:

if ($host = x.domain.com) {
    return 550;
}

error_page 550 = @xauth;

location @xauth {
    auth_basic "Admin Login";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

5

คุณไม่จำเป็นต้องใช้คำสั่งตำแหน่งหากคุณใช้แผนที่ นี่คือทางออกที่ง่ายที่สุดและเทียบเท่าฉันคิดได้ คุณสามารถตั้งชื่อไฟล์ htpasswd ตามที่คุณ $ HTTP_HOST x.domain.com.htpasswdเช่น

map $http_host $auth_type {
    default "off";               #This will turn off auth-basic
    x.domain.com "Restricted";   #This or any other string will turn it back on
}

server {
    auth_basic $auth_type;
    auth_basic_user_file /etc/nginx/conf.d/$http_host.htpasswd;
}

1
ทำงานเหมือนจับใจ
conradkleinespel

@Tom Siwik ยังไงก็ตามฉันสามารถปรับมันเพื่อบังคับใช้ข้อ จำกัด IP ด้วยallow/ denyในลักษณะเดียวกันได้หรือไม่?
ขนมปังปิ้ง

น่าจะเป็นไปได้คุณสามารถแมปตัวแปรมากมายได้ ดูที่: nginx.org/en/docs/varindex.htmlสำหรับรายการตัวแปร คุณอาจจะต้องแทน$remote_addr $http_hostไม่แน่ใจเกี่ยวกับช่วงแม้ว่า
Tom Siwik

4

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

คุณสามารถทำการสลัมสลัมโดยใช้บางสิ่งบางอย่างเช่น ($ http_host ~ foo) แต่จากนั้นคุณมักจะหนีไปจากพฤติกรรมที่คาดเดาไม่ได้และแปลกประหลาดของถ้าเป็นเอกสารไว้ที่นี่: http://wiki.nginx.org/IfIsEvil

อย่าพยายามชิงไหวชิงพริบ Nginx เพียงใช้ตัวเลือกที่ให้คุณและคุณจะมีอาการปวดหัวน้อยลง

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