अपाचे डिफ़ॉल्ट / कैच-सभी वर्चुअल होस्ट?


67

अगर मेरे पास 3 डोमेन हैं, तो domain1.com, domain2.com, और domain3.com, क्या सूचीबद्ध डोमेन के लिए डिफ़ॉल्ट वर्चुअल होस्ट सेट करना संभव है? उदाहरण के लिए, अगर मेरे पास होगा:

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

यदि आप एक डोमेन रजिस्टर करते हैं और इसे मेरे सर्वर पर इंगित करते हैं, तो वह सब कुछ डिफ़ॉल्ट रूप से दिखाएगा जो कि डोमेन 3 के समान है। क्या यह संभव है?

जवाबों:


45

हाँ, यह काम करना चाहिए, छोड़कर ServerAlias ​​"*" होना चाहिए, जिसमें Servername एक वास्तविक होस्टनाम पर सेट है। आपको यह सुनिश्चित करने की आवश्यकता हो सकती है कि VirtualHost बहुत आखिरी लोड हो ...


यह काम करना चाहिए, लेकिन नहीं। यदि कोई डोमेन विशेष रूप से सूचीबद्ध नहीं है, तो मुझे "फ़ायरफ़ॉक्स सर्वर नहीं मिल सकता है।"
SJaguar13

2
क्या आपने इसे "ServerName होस्ट" और "ServerAlias ​​*" के रूप में सेट किया? मैंने मूल रूप से इस पर जोर नहीं दिया, लेकिन ServerName वाइल्डकार्ड नहीं लेता, केवल ServerAlias ​​करता है। ServerName को एक वास्तविक होस्टनाम होने की आवश्यकता है।
Freiheit

इसके अलावा, अन्य virtualhosts काम करते हो? अपाचे का क्या संस्करण?
freiheit

"फ़ायरफ़ॉक्स सर्वर नहीं मिल सकता है।" एक अपाचे समस्या नहीं है। आपको अधिक विवरण की आवश्यकता है (यदि किसी सर्वर से संपर्क किया गया है, तो त्रुटि कोड क्या है ...)
Law29

अजीब है कि मेरे लिए काम नहीं करता है, यह हमेशा मेजबान हेडर की परवाह किए बिना पहली
virtualhost

80

नाम-आधारित वर्चुअल होस्ट का उपयोग करते समय, लोड किया गया पहला वर्चुअल होस्ट कॉन्फ़िगरेशन डिफ़ॉल्ट होगा (स्रोत: अपाचे विकी )। उदाहरण के लिए, नीचे विन्यास के साथ, अन्यथा बेजोड़ डोमेन इसके साथ मेल खाएगा domain-one.com:

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

कई सर्वरों में एक अखंड कॉन्फ़िगरेशन फ़ाइल नहीं होती है, लेकिन कई होस्ट-विशिष्ट कॉन्फ़िगरेशन फ़ाइलों को निम्नानुसार व्यवस्थित किया जाता है:

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

इस स्थिति में, किसी विशेष वर्चुअल होस्ट कॉन्फ़िगरेशन लोड को पहले बनाने के लिए, सिम्लिंक को किसी ऐसी चीज़ का नाम दें, जिसे पहले सॉर्ट किया जाएगा, जैसे कि 00-default


कुछ अन्य उत्तर बिल्कुल सही नहीं हैं। अपाचे विकी के अनुसार, वर्चुअल होस्ट में ए सेटServerName करना गलत है। यदि बिना होस्ट होस्ट को ServerNameपहले लोड नहीं किया गया है, तो Apache कभी भी इसका उपयोग नहीं कर सकता है, क्योंकि पहले होस्ट लोड किया गया डिफ़ॉल्ट होगा।

इसके अलावा, जबकि ServerAlias *वास्तव में कुछ भी मैच होगा, यह बाद में परिभाषित अन्य आभासी होस्ट को भी ओवरराइड कर सकता है। हो सकता है कि यह दृष्टिकोण तब काम करेगा जब इसे हमेशा अंतिम वर्चुअल होस्ट के रूप में परिभाषित किया जाए (जैसा कि प्रश्न में दिए गए कॉन्फ़िगरेशन में है), लेकिन इसका मतलब है कि एक नया निर्देश जोड़ना और ऊपर दिए गए आदेश को बदलने के बजाय केवल क्रम बदलना।


+ 1 मिलियन इंटर्न आपको सर! इसे पहले डिफ़ॉल्ट होना होगा।
रयान

क्या आप जानते हैं कि पहले कौन आता है, httpd.conf या conf.d / xyz.conf?
एसा वरेमो

2
"पहला वर्चुअल होस्ट कॉन्फ़िगरेशन लोड किया गया डिफ़ॉल्ट होगा" XAMPP (विंडोज) पर स्थानीय एसएसएल डोमेन के साथ मेरी समस्या हल हो गई है। ऐसा लगता है कि अपाचे प्रत्येक बंदरगाह के लिए चूक के रूप में पहली vhost का उपयोग करता है, तो ठीक से दोनों असुरक्षित / सुरक्षित अनुरोधों के लिए गैर-मिलान डोमेन संभाल करने में, वहाँ होना चाहिए 80/443 बंदरगाहों के लिए 2 स्पष्ट "डिफ़ॉल्ट" कॉन्फ़िगरेशन की शुरुआत में परिभाषितhttpd-vhosts.conf
विरोन

1
@EsaVaremo - httpd.conf को पहले लोड किया जाएगा, और इसमें एक लाइन शामिल होगी जो कि सोर्स conf.d / xyz.conf (या संभावना, conf.d / *) को शामिल करेगी। शामिल करने से पहले किसी भी विन्यास (vhosts सहित) को पहले संसाधित किया जाएगा; शामिल फ़ाइलों के बाद शामिल लाइन के बाद कुछ भी संसाधित किया जाता है।
डेन प्रिट्स

7

एक सर्वरनाम निर्दिष्ट न करें, और यह आपका डिफ़ॉल्ट विस्टा बन जाता है।

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

यह भी सुनिश्चित करें कि आपने मुख्य httpd.conf फ़ाइल में एक डॉक्यूमेंटरूट निर्दिष्ट नहीं किया है, क्योंकि यह vhosts पर पूर्ववर्ती स्थिति लेगा।


मेरे पास पहले वर्चुअल होस्ट के रूप में सूचीबद्ध है, और मुझे अभी भी "फ़ायरफ़ॉक्स सर्वर नहीं मिल रहा है।"
SJaguar13

2
मैं असहमत हूं। मैं एक सर्वरनाम के बिना अपना पहला वर्चुअल होस्ट सेट किया था, हालांकि, यह कुछ वर्चुअल होस्ट्स के साथ संघर्ष करने लगता है, लेकिन दूसरों को नहीं। मैंने ServerName जोड़कर इस समस्या को हल किया, लेकिन इसे कुछ यादृच्छिक डोमेन पर सेट किया जो मेरे सर्वर पर नहीं है। चूंकि यह पहला वर्चुअल होस्ट है, इसलिए इसे डिफ़ॉल्ट के रूप में उपयोग किया जाता है, लेकिन केवल तब मेल खाता है जब किसी डोमेन का मिलान किसी अन्य सर्वरनाम से नहीं किया जाता है।
जोशदान

3

आदेश महत्वपूर्ण है - सूची के प्रमुख के लिए बाकी सब कुछ के लिए अपनी vhost परिभाषा को स्थानांतरित करें।


2

_Default_ वर्चुअल होस्ट का उपयोग करें और इसे http://httpd.apache.org/docs/2.2/vhosts/examples.html में बताए अनुसार पहले http -vhosts.conf में रखें।

"किसी भी अनिर्दिष्ट आईपी पते और पोर्ट के लिए हर अनुरोध को पकड़ना, अर्थात, एक पता / पोर्ट संयोजन जो किसी अन्य वर्चुअल होस्ट के लिए उपयोग नहीं किया जाता है [...] एक डिफ़ॉल्ट vhost कभी भी एक अनुरोध नहीं करता है जो एक पते / पोर्ट को भेजा गया हो नाम-आधारित vhosts के लिए उपयोग किया जाता है। यदि अनुरोध में कोई अज्ञात या कोई होस्ट नहीं है: शीर्षलेख यह हमेशा प्राथमिक नाम-आधारित vhost (उस पते / पोर्ट के लिए vhost कॉन्फ़िगरेशन फ़ाइल में पहले दिखाई देता है) से परोसा जाता है। "

एक लाइव से स्निपेट लेकिन obduscated httpd-vhosts.conf जो पोर्ट को सभी vhosts को लॉक करने के लिए होता है:

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

Vhost मिलान प्रक्रिया का गहन विवरण यहां पाया जा सकता है: http://httpd.apache.org/docs/2.2/vhosts/details.html


2
_default_इसका उपयोग केवल गैर-मिलान वाले IP के लिए किया जाता है , इसलिए जब आपके पास वाइल्डकार्ड vhost (*: 80) होगा तो इसका उपयोग कभी नहीं किया जाएगा।
विरोन

2

वाइल्डकार्ड में आपकी साइट कॉन्फ़िगरेशन फ़ाइलें शामिल हैं:

Include path/to/site/confs/*httpd.conf

अपनी साइट की गोपनीय फाइलों को व्यवस्थित करें ताकि वे एक अपेक्षित क्रम में लोड हो जाएं। उदाहरण...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

आदि...

अपाचे इन्हें क्रम में पढ़ेंगे। फिर एक ऐसा बनाएं जो किसी भी बेजोड़ वर्चुअल होस्ट को पकड़ने के लिए हमेशा आखिरी लोड करेगा और डिफ़ॉल्ट साइट लोड करने के बजाय 404 लौटाएगा।

99-मोहक-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

अपने httpd पर जो भी पोर्ट सुनते हैं, उन पोर्ट को बदलना न भूलें। या यदि आपके पास httpd विशिष्ट इंटरफेस पर सुनना है, तो आपको इसके बजाय प्रत्येक इंटरफ़ेस के लिए एक catchall जोड़ना होगा, जैसे:

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

उम्मीद है की यह मदद करेगा। मैं इस विधि का उपयोग उन साइटों को लोड करने के लिए करता हूं, जो मैं निर्दिष्ट करता हूं और अनपेक्षित वर्चुअल होस्ट को अनपेक्षित रूप से अनपेक्षित साइट लोड करने से रोकता हूं।


1

सबसे अच्छा समाधान एक "1" से शुरू होने वाली साइट कॉन्फ़िगरेशन फ़ाइल का नाम बदलना है, इसलिए यह पहले लोड होगा और वह आपकी डिफ़ॉल्ट साइट होगी।

Apache2 डिफ़ॉल्ट पेज के रूप में पहली भरी हुई vhost फ़ाइल बनाता है।


डिफ़ॉल्ट अपाचे इंस्टॉलेशन में 000-defaultइस कारण से वर्चुअल होस्ट भी है ।
vp_arth

0

<VirtualHost *:port>होस्टनाम के लिए ServerName / ServerAlias का उपयोग करने और निर्दिष्ट करने के दौरान, जिसकी आपको परवाह है, जो मुझे करने की आवश्यकता है।

मेरी स्थिति में थोड़ी पृष्ठभूमि:

मेरे पास ISP से डायनामिक IP एड्रेस है, इसलिए मेरा IP एड्रेस डायनेमिक आईपी एड्रेस रजिस्टर करने वाली कंपनी (मेरे मामले में noip.org) पर रजिस्टर्ड है। मेरे "होस्ट" में से एक को मेरे DNS पंजीकरण में myabc.example.com को CNAME के ​​रूप में पंजीकृत करना होगा जो host1.ddns.net की ओर इशारा करता है। लेकिन host2.ddns.net के रूप में छोड़ दिया गया था। मैं चाहता था कि myabc.example.com और host1.ddns.net साइट 1 पर जाएं और host2.ddns.net साइट 2 पर जाएं और डिफ़ॉल्ट पर जाने के लिए मेरे आईपी पते सहित कुछ और।

पहले conf फ़ाइल पढ़ने डिफ़ॉल्ट, यानी हो जाएगा 000_def.conf, 001_site1.conf, 002_site2.confसाथ इसी क्रम में पढ़ा जाएगा 000_def.confडिफ़ॉल्ट साइट के रूप में। (नोट: मेरे मामले में, मेरे पास ये "फाइलें" हैं, /etc/apache2/sites-enabledजो वास्तव में वास्तविक आत्मविश्वास फ़ाइल के लिए गतिशील लिंक हैं /etc/apache2/sites-available)

क्योंकि Servername का उपयोग 001_site1.conf और 002_site2.conf में किया जा रहा है, इसे 000_def.conf में भी सेट किया जाना चाहिए।

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.