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>.+)$;
मोहम्मद अबूशाही

आप शायद काफी हद तक सही हैं - मैं किसी भी कारण के बारे में नहीं सोच सकता हूँ जिस तरह से यह इस समय था, इसलिए मैंने इसे आपके सुझाव में बदल दिया है।
साइबरबरी86

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

यदि आप मानचित्र का उपयोग करते हैं तो आपको स्थान निर्देश का उपयोग करने की आवश्यकता नहीं है। यह सबसे सरल समाधान है और इसके बराबर मैं सोच सकता हूं। आप अपने $ http_host के अनुसार htpasswd फ़ाइलों को नाम दे सकते हैं 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
एक जादू की तरह काम करता है।
कॉनराडक्लेइन्सपेल

@Tom Siwik वैसे भी मैं इसे allow/ साथ denyही / के साथ आईपी प्रतिबंधों को लागू करने के लिए समायोजित कर सकता हूं ?
टोस्ट

संभव होना चाहिए, आप बहुत सारे चर पर मैप कर सकते हैं। देखें: चर की सूची के लिए nginx.org/en/docs/varindex.html । आप शायद आवश्यकता होगी $remote_addrके बजाय $http_host। हालांकि सीमाओं के बारे में निश्चित नहीं है।
टॉम सिविक

4

यदि आपके पास कई (सब) डोमेन हैं और वे एक जैसे व्यवहार नहीं करते हैं, तो आप कई सर्वर ब्लाकों का उपयोग करते हैं। क्षमा करें, लेकिन यह गंभीरता से सबसे अच्छा तरीका है, भले ही आपके पास एक बड़ा कॉन्फ़िगरेशन हो।

You can do a ghetto hack by using something like if ($http_host ~ foo) but then you'll most likely run afoul of the unpredictable and weird behaviour of if as documented here: http://wiki.nginx.org/IfIsEvil

Don't try to outsmart Nginx, just use the options it gives you and you'll have far less headaches.

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.