अपाचे आभासी मेजबान * स्रोत * आईपी पर आधारित है


9

क्या स्रोत आईपी पर आधारित विभिन्न वर्चुअल होस्ट के लिए अपाचे को कॉन्फ़िगर करना संभव है ? (यानी एक ही इंटरफ़ेस, एक ही होस्टनाम, लेकिन दो अलग-अलग वर्चुअल होस्ट, अलग-अलग सामग्री के साथ, स्रोत आईपी पर आधारित हैं ।)

इसके लिए प्रेरणा इतनी है कि मेरा आईपी पता साइट तक उचित तरीके से पहुंच सकता है, लेकिन बाकी सभी को होल्डिंग पेज मिलता है। ऐसा लगता है कि पारंपरिक समाधान mod_rewrite का उपयोग करके आगंतुकों को एक ही docroot के भीतर एक अलग पृष्ठ पर ले जाता है, लेकिन मैं इसके बजाय होल्डिंग पृष्ठ के लिए एक पूरी तरह से अलग docroot का उपयोग करना चाहूंगा।


BTW, आपको सर्वर पर अपने लिए इस तर्क की आवश्यकता क्यों है ? आप केवल अपने होस्ट फ़ाइल का उपयोग करके डोमेन को परीक्षण सर्वर (या अपने कंप्यूटर) के आईपी में मैप कर सकते हैं।
डैन ग्रॉसमैन

क्या आपके पास संभालने के लिए कई नाम हैं या केवल एक ही है? जैसा कि आप नामों के साथ या आईपी के साथ (वर्चुअलहोस्टेस को परिभाषित) काम कर सकते हैं।
Regilero

कोई विशेष कारण क्यों एक अलग डॉक्टर रूट?
anthonysomerset

ओपी के कथित तर्क का कोई मतलब नहीं है (एक होल्डिंग पेज फिर से लिखना के साथ बहुत अच्छा काम करता है), लेकिन अगर आप कहते थे, एक साइट को फिर से काम करना, तो rework को होस्ट करने के लिए एक तरीका चाहिए, और यह नहीं पता था कि उपडोमेन मौजूद थे, आप हो सकते हैं इसे इस तरह से करने का फैसला करें।
Womble

आप अपने सिवाय सभी तक पहुंच को अवरुद्ध करने के लिए अनुमति / अस्वीकृत लाइनों का उपयोग कर सकते हैं और 403 त्रुटियों के लिए एक कस्टम त्रुटि दस्तावेज़ है (यह सुनिश्चित करें कि आपने इसे एक निर्देशिका में रखा है और उस निर्देशिका तक पहुंच की अनुमति दें, अन्यथा त्रुटि दस्तावेज़ 403 भी होगा), या नियमों को फिर से लिखना / उपयोग की शर्तों को फिर से लिखना, या अपने प्री-लॉन्च / टेस्टिंग साइट को dev.example.com जैसे सबडोमेन पर ले जाएं, तो example.com में होल्डिंग पेज हो सकता है
Smudge

जवाबों:


5

मुझे नहीं पता कि अपाचे स्तर में यह संभव है (बिना mod_rewrite, वैसे भी)।

यहाँ एक और विचार है। क्या होगा यदि आप दो अपाचे वर्चुअल होस्ट सेट करते हैं और फिर वर्चुअल होस्ट को सही करने के लिए विजिटर को पारदर्शी रूप से अग्रेषित करने के लिए iptables का उपयोग करते हैं? कुछ इस तरह

iptables -A PREROUTING -t nat -i eth0 -p tcp -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.actual.site:someport
iptables -A PREROUTING -t nat -i eth0 -p tcp ! -s your.ip.address -d your.server --dport 80 -j DNAT --to-destination your.holding.site:someport

या ऐसा ही कुछ। :)


मैं कहूंगा कि यह सबसे कम विकल्प है।
Womble

8

यह वास्तव में एक अलग वर्चुअल होस्ट नहीं होगा। लेकिन जैसे कुछ का उपयोग कर mod_rewrite या mod_alias आप जिसके लिए उपयुक्त अनुमतियां निर्धारित किया है किसी भी फ़ोल्डर की सामग्री को बाहर की सेवा कर सकते हैं। वहाँ केवल एक डॉक्टर है, लेकिन आप प्रभावी रूप से मक्खी पर बदल सकते हैं।

ऐसा करने का एक तरीका यह हो सकता है:

<VirtualHost *.80>
    ServerName example.com
    ...
    DocumentRoot "/path/to/root"
    <Directory "/path/to/root">
       ...
    </Directory>
    <Directory "/path/to/not/root">
       Order allow,deny
       #replace with your IP
       Allow from 192.168.0.100 
       ...
    </Directory>
    RewriteEngine On
    #Rewrite to alternate path if IP address matches
    RewriteCond %{REMOTE_ADDR} ^192\.168\.0\.100$
    RewriteRule ^/(.*)$ /path/to/not/root/$1
<VirtualHost>

ध्यान दें कि यह एक देव उपडोमेन के साथ इसे संभालने के लिए शायद थोड़ा क्लीनर होगा।


4

अपाचे 2.3 या बाद में

अपाचे 2.3 या बाद में आप जाहिरा तौर पर ऐसा कुछ कर सकते हैं (परीक्षण):

<VirtualHost *:80>
    ServerName www.example.com

    <If "-R '10.10.10.10'">
        # The next version of the website...
        Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
    </If>
    <Else>
        # The standard version (e.g. holding page).
        Alias /favicon.ico /home/ubuntu/website/favicon.ico
        Alias /static/ /home/ubuntu/static/
        WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
    </Else>

    # and so on...

</VirtualHost>

Apache 2.2 या पहले का

अद्यतन: यह एक अच्छा समाधान नहीं है। निचे देखो।

आपको इस तरह से एक हैक करना होगा। ध्यान दें [PT]जो "पश्थ्रू" के लिए खड़ा है। इसके बिना, एक वास्तविक HTTP रीडायरेक्ट को क्लाइंट को वापस भेज दिया जाता है, जो संभवतः वह नहीं है जो आप चाहते हैं। वह [OR]चीज़ (जो "या" के लिए है) से पता चलता है कि कई पतों का मिलान कैसे किया जाता है।

Alias /next/favicon.ico /home/ubuntu/website-new/favicon.ico
Alias /next/static/ /home/ubuntu/static/
WSGIScriptAlias /next /home/ubuntu/website-new/main/wsgi.py

Alias /favicon.ico /home/ubuntu/website/favicon.ico
Alias /static/ /home/ubuntu/static/
WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py

# Rewrite for our IP.
RewriteEngine On
RewriteCond %{REMOTE_ADDR} ^80\.4\.170\.209$ [OR]
RewriteCond %{REMOTE_ADDR} ^94\.193\.52\.157$
RewriteRule ^/(.*) /next/$1 [PT]

आपको mod_rewriteइस आदेश के साथ सक्षम करने की आवश्यकता है जो आप डेबियन / उबंटू पर कर सकते हैं:

sudo a2enmod rewrite

ध्यान दें कि यह विधि आपके परीक्षण स्थल तक पहुंचने से अन्य लोगों को पूरी तरह से प्रतिबंधित नहीं करती है, इसलिए आप शायद कुछ सुरक्षा जोड़ना चाहते हैं, या बस की तुलना में अधिक अस्पष्ट उपसर्ग चुनें next

Mod_rewrite पद्धति पर अपडेट करें।

इस पद्धति के साथ कुछ समस्याएं हैं। सबसे पहले, Django इस तरह एक ही प्रक्रिया में दो साइटों के साथ काम नहीं करता है, आपको इस उत्तर में निर्देशों का पालन करने की आवश्यकता है ।

दूसरे mod_rewrite POSTअनुरोधों के साथ काम नहीं करते हैं ! सभी POSTको चुपचाप बदल दिया जाता है GETऔर पोस्ट डेटा को छोड़ दिया जाता है। अधिक निराश! इसलिए मैं आपको उपयोग करने की सलाह देता हूं ...

iptables संस्करण

बस दो अलग-अलग पोर्ट पर सर्वर चलाएं। यह एक WSGI सामान दो अलग django साइटों के लिए शामिल है।

<VirtualHost *:80>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/alpha/favicon.ico
    Alias /static/ /home/ubuntu/alpha/static/

    WSGIDaemonProcess alpha_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/alpha/alpha/wsgi.py
    WSGIProcessGroup alpha_wsgi

    ServerAdmin info@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:1222>
    ServerName www.example.com

    Alias /favicon.ico /home/ubuntu/main/favicon.ico
    Alias /static/ /home/ubuntu/main/static/

    WSGIDaemonProcess main_wsgi user=www-data group=www-data
    WSGIScriptAlias / /home/ubuntu/main/main/wsgi.py
    WSGIProcessGroup main_wsgi

    ServerAdmin info@example.com

    ErrorLog ${APACHE_LOG_DIR}/error.log

    # Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
    LogLevel warn

    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

फिर आप इस iptablesआदेश का उपयोग पोर्ट 80 पर अपने आईपी पते से पोर्ट 1222 पर अनुरोधों को करने के लिए कर सकते हैं :

sudo iptables -A PREROUTING -t nat -p tcp -s your.ip.address --dport 80 -j DNAT --to-destination :1222

बदले -Aके लिए -Dनियम निकालना।

ध्यान दें कि डॉक्स आपको अतिरिक्त Listenऔर NameVirtualHostकमांड जोड़ने की आवश्यकता है , लेकिन मैंने वास्तव में पाया कि यह उनके बिना काम करता है, और उन्हें जोड़ने से यह टूट गया (कम से कम उबंटू में)।


2.3+ के लिए आपका जवाब Alias cannot occur within <Directory/Location/Files> sectionकिसी भी तरह का फिक्स देता है ? मुझे वास्तव में इसकी जरूरत है: $
Gizmo

2

AFAIK, ऐसा करने का एकमात्र तरीका दस्तावेज़ रूट के भीतर दस्तावेज़ रूट के बाहर आपकी सामग्री के लिए एक स्थान को समेटना है, फिर उस अनुरोध को फिर से लिखना है।


1

जैसे @Timmmm ने कहा, लेकिन ipmatch स्टेटमेंट को ठीक करना ('10 .10.10.10 'पर ध्यान दें): ServerName www.example.com

<If "%{REMOTE_ADDR} -ipmatch '10.10.10.10'">
    # The next version of the website...
    Alias /favicon.ico /home/ubuntu/website-new/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website-new/main/wsgi.py
</If>
<Else>
    # The standard version (e.g. holding page).
    Alias /favicon.ico /home/ubuntu/website/favicon.ico
    Alias /static/ /home/ubuntu/static/
    WSGIScriptAlias / /home/ubuntu/website/main/wsgi.py
</Else>

# and so on...

क्योंकि अन्यथा यह त्रुटि दिखाएगा:

Cannot parse condition clause: -ipmatch requires subnet/netmask as constant argument
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.