nginx server_name वाइल्डकार्ड या कैच-ऑल


119

मेरे पास nginx का एक उदाहरण है जो कई वेबसाइटों पर कार्य करता है। पहला सर्वर के आईपी पते पर एक स्थिति संदेश है। दूसरा एक व्यवस्थापक कंसोल है admin.domain.com। ये महान काम करते हैं। अब मैं एक डोमेन पर जाने के लिए अन्य सभी डोमेन अनुरोधों को पसंद index.phpकरूंगा - मेरे पास डोमेन और सबडोमेन का भार है और उन सभी को एक नगीन विन्यास में सूचीबद्ध करना अव्यावहारिक है।

अब तक मैंने सेटिंग server_nameकरने की कोशिश की है, *लेकिन एक अमान्य वाइल्डकार्ड के रूप में विफल रहा। *.*तब तक काम करता है जब तक मैं अन्य सर्वर ब्लॉक नहीं जोड़ता, तब मुझे लगता है कि यह उनके साथ संघर्ष करता है।

क्या अन्य साइटों को परिभाषित करने के बाद nginx में कैच-ऑल सर्वर ब्लॉक चलाने का कोई तरीका है?

नायब मैं एक स्पैमर नहीं हूं, ये उपयोगी सामग्री वाली वास्तविक साइटें हैं, वे सिर्फ एक डेटाबेस से एक ही सीएमएस द्वारा संचालित हैं!


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_servernginx 1.4.6 पर काम नहीं करता है जो वर्तमान में Ubuntu 14.04 पर नवीनतम संस्करण है ... जब मैं इसे जोड़ता हूं, तो configtestकमांड एक त्रुटि देता है, और सर्वर को पुनरारंभ करने से भी काम नहीं करता है। मैंने डेबियन जेसी के साथ अपने सर्वर पर ठीक उसी विन्यास की कोशिश की है, जिसमें नगणक्स 1.6.2 है, और यह पूरी तरह से काम करता है। तो एक और संस्करण का प्रयास करें यदि आप 1.4.6 पर हैं ...
निकोमक

1
HTTPS के लिए साइड नोट: default_serverनिर्देश सर्वर भी सेट करता है जो उस पोर्ट पर अनुरोधों के लिए SSL हैंडशेक को हैंडल करेगा। इसलिए, यदि आप एसएसएल को संभालने के लिए सर्वर ब्लॉक ए चाहते हैं, लेकिन एचटीटीपीएस के लिए सर्वर बी के रूप में कार्य करने के लिए server_name ~^(.+)$सर्वर बी पर समाधान बी
ल्यूक

66

एक साधारण अंडरस्कोर भी काम करता है:

server_name  _;

स्रोत: http://nginx.org/en/docs/http/server_names.html


2
हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन उत्तर के आवश्यक भागों को शामिल करना और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक-केवल उत्तर अमान्य हो सकते हैं यदि लिंक किए गए पृष्ठ बदल जाते हैं।
केमिक्सर

10
लिंक सिर्फ एक संदर्भ के रूप में प्रदान किया गया है। उपरोक्त दो पंक्तियाँ वास्तव में उत्तर हैं: सर्वर_name के लिए मान के रूप में केवल एक अंडरस्कोर लगाना वांछित "कैच ऑल" व्यवहार का उत्पादन करेगा।
jp.gouigoux

55
यह उत्तर सत्य नहीं है। संदर्भ यह स्पष्ट करता है कि यह तब तक काम नहीं करेगा जब तक आपके पास listen 80 default_serverआपके कॉन्फ़िगरेशन में भी नहीं ।
बीटल

5
इस लेख को भी देखें ।
बीटल

2
हो सकता है कि मैंने डॉक्स को गलत समझा हो, लेकिन "इस नाम के बारे में कुछ खास नहीं है, यह अवैध डोमेन नामों के असंख्य में से एक है, जो कभी भी किसी वास्तविक नाम के साथ प्रतिच्छेद नहीं करता है। अन्य अमान्य नाम जैसे" - "और" @! "हो सकता है। समान रूप से इस्तेमाल किया जा सकता है। " तो _क्या सिर्फ एक अमान्य नाम है?
फ्लोरियन क्लेन

26

यह काम करेगा:

server_name ~^(.+)$

13
server_name ~.अधिक कुशल प्रतीत होता है
youfu

2
इसने मेरे लिए काम किया। जो भी कारण मुझे काम करने के लिए default_server नहीं मिला, वह मेरे अन्य सभी vhosts को ओवरराइड कर रहा था।
न्यूरोएक्ससी

11

मेरे लिए किसी तरह डिफॉल्ट_सर्वर काम नहीं कर रहा था। मैंने इसे हल किया

server_name ~^.*$

सभी की नियमित अभिव्यक्ति का उपयोग करना।


सभी उच्च मतदान विकल्पों की कोशिश की और यह एकमात्र ऐसा काम है। नोट: मैं IP पते बनाम URL के साथ एक सर्वर पर जाने की कोशिश कर रहा हूं।
ममपर्सैट

9

केवल 1 serverनिर्देश

से Nginx listenडॉक्स

Default_server पैरामीटर, यदि मौजूद है, तो सर्वर को निर्दिष्ट पते के लिए डिफ़ॉल्ट सर्वर बनने का कारण होगा: पोर्ट जोड़ी। यदि किसी भी निर्देश में default_server पैरामीटर नहीं है, तो पता के साथ पहला सर्वर: पोर्ट जोड़ी इस जोड़ी के लिए डिफ़ॉल्ट सर्वर होगा।

यदि आपके पास केवल 1 serverनिर्देश है, जो सभी अनुरोधों को संभाल लेगा, तो आपको कुछ भी सेट करने की आवश्यकता नहीं है।


एकाधिक serverनिर्देश

यदि आप निर्दिष्ट serverनिर्देश के साथ सभी अनुरोधों का मिलान करना चाहते हैं , तो बस default_serverपैरामीटर जोड़ें listen, Nginx इस serverनिर्देश का उपयोग डिफ़ॉल्ट रूप से करेगा ।

server {
    listen 80 default_server;
}

के बारे में server_name _;

से Nginx डॉक्स

कैच-ऑल सर्वर के उदाहरण में अजीब नाम "_" देखा जा सकता है:

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

इस नाम के बारे में कुछ खास नहीं है, यह अमान्य डोमेन नामों में से एक असंख्य है जो किसी भी वास्तविक नाम के साथ कभी भी अंतर नहीं करता है। अन्य अमान्य नाम जैसे "-" और "! @ #" समान रूप से उपयोग किए जा सकते हैं।

इससे कोई फर्क नहीं पड़ता कि server_nameआपने क्या सेट किया है, यह सिर्फ एक अमान्य डोमेन नाम है



2

अगर आप भी खाली Hostहेडर (जिसे HTTP / 1.0 में अनुमति है ) के साथ अनुरोधों को पकड़ना चाहते हैं, तो आप रेगेक्स और खाली दोनों का उपयोग कर सकते हैं server_name:

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