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.