Apache โฮสต์เสมือนตาม * source * IP


9

เป็นไปได้หรือไม่ที่จะกำหนดค่า Apache สำหรับโฮสต์เสมือนที่แตกต่างกันตามIP ต้นทาง ? (เช่นอินเทอร์เฟซเดียวกันชื่อโฮสต์เดียวกัน แต่โฮสต์เสมือนที่แตกต่างกันสองรายการซึ่งมีเนื้อหาแตกต่างกันตามIP ต้นทาง )

แรงจูงใจในการทำเช่นนี้คือเพื่อให้ที่อยู่ IP ของฉันสามารถเข้าถึงเว็บไซต์ได้อย่างเหมาะสม แต่ทุกคนจะได้รับหน้าการถือครอง โซลูชันทั่วไปดูเหมือนว่าจะใช้ mod_rewrite เพื่อนำผู้เข้าชมไปยังหน้าแยกต่างหากภายใน docroot เดียวกัน แต่ฉันต้องการใช้ docroot ที่แตกต่างกันโดยสิ้นเชิงสำหรับหน้าโฮลดิ้งแทน


BTW ทำไมคุณต้องใช้ตรรกะนี้เพื่อตัวคุณเองบนเซิร์ฟเวอร์ คุณสามารถแมปโดเมนกับ IP ของเซิร์ฟเวอร์ทดสอบ (หรือคอมพิวเตอร์ของคุณเอง) เพื่อตัวคุณเองโดยใช้ไฟล์โฮสต์ของคุณ
Dan Grossman

คุณมีชื่อหลายชื่อที่จะจัดการหรือมีเพียงชื่อเดียว? ตามที่คุณสามารถทำงานได้ (กำหนด Virtualhosts) ด้วยชื่อหรือด้วย IP
regilero

มีสาเหตุใดที่ทำให้รูท doc แตกต่างกัน
anthonysomerset

เหตุผลที่ระบุไว้ของ OP ไม่สมเหตุสมผล (หน้าโฮลดิ้งใช้งานได้ดีกับการเขียนซ้ำ) แต่ถ้าคุณพูดการ reworking ไซต์ต้องการวิธีในการโฮสต์การทำงานซ้ำและไม่รู้ว่ามีโดเมนย่อยอยู่คุณอาจ ตัดสินใจที่จะทำแบบนี้
womble

คุณสามารถใช้บรรทัดอนุญาต / ปฏิเสธเพื่อบล็อกการเข้าถึงทุกคนยกเว้นคุณและมีเอกสารข้อผิดพลาดที่กำหนดเองสำหรับข้อผิดพลาด 403 (ตรวจสอบให้แน่ใจว่าคุณใส่ไว้ในไดเรกทอรีและอนุญาตให้เข้าถึงไดเรกทอรีนั้นมิฉะนั้นเอกสารข้อผิดพลาดจะ 403 เช่นกัน) หรือ ใช้กฎการเขียนซ้ำ / เงื่อนไขการเขียนซ้ำหรือย้ายไซต์การเปิดตัวล่วงหน้า / ทดสอบไปยังโดเมนย่อยเช่น dev.example.com จากนั้น example.com อาจมีหน้าการถือครอง
Smudge

คำตอบ:


5

ฉันไม่ทราบว่าเป็นไปได้ (ไม่มี mod_rewrite อยู่แล้ว) ในระดับ Apache

นี่คือแนวคิดอื่น ถ้าคุณตั้งค่าโฮสต์เสมือน Apache สองโฮสต์จากนั้นใช้ 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คุณสามารถให้บริการเนื้อหาจากโฟลเดอร์ใด ๆ ที่คุณได้ตั้งค่าการอนุญาตที่เหมาะสม มี docroot เพียงอันเดียว แต่คุณสามารถเปลี่ยนสิ่งนั้นได้อย่างมีประสิทธิภาพ

วิธีหนึ่งในการทำอาจเป็น:

<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>

โปรดทราบว่าอาจเป็นบิตที่สะอาดกว่าในการจัดการกับโดเมนย่อย dev


4

Apache 2.3 หรือใหม่กว่า

ด้วย Apache 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]ที่ย่อมาจาก "passthrough" หากไม่มีมันการเปลี่ยนเส้นทาง 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สิ่งที่คุณสามารถทำได้บน Debian / Ubuntu ด้วยคำสั่งนี้:

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คำสั่งนี้เพื่อกำหนดเส้นทางคำขอจากที่อยู่ ip ของคุณบนพอร์ต 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คำสั่ง แต่จริง ๆ แล้วฉันพบว่ามันทำงานโดยไม่มีพวกเขาและการเพิ่มพวกเขาทำให้มันแตก (อย่างน้อยใน Ubuntu)


คำตอบของคุณสำหรับ 2.3+ ให้Alias cannot occur within <Directory/Location/Files> sectionการแก้ไขใด ๆ ฉันต้องการสิ่งนี้จริง ๆ : $
Gizmo

2

AFAIK วิธีเดียวที่จะทำเช่นนี้คือการเชื่อมโยงตำแหน่งภายในรูทเอกสารกับเนื้อหาของคุณนอกรูทเอกสารจากนั้นเขียนคำขอใหม่


1

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