Віртуальний хост Apache на основі * джерела * IP


9

Чи можна налаштувати Apache для різних віртуальних хостів на основі вихідного IP? (тобто той самий інтерфейс, те саме ім’я хоста, але два різних віртуальних хости, з різним вмістом на основі джерела IP.)

Мотивація цього полягає в тому, щоб моя IP-адреса могла отримувати належний доступ до сайту, але щоб усі інші отримували сторінку з підтримкою. Звичайно, звичайним рішенням є використання mod_rewrite для спрямування відвідувачів на окрему сторінку в межах однієї docroot, але я хотів би використовувати зовсім інший docroot для сторінки, що тримає.


BTW, навіщо вам потрібна ця логіка для себе на сервері? Ви можете зіставити домен на IP-адресу тестувального сервера (або власного комп'ютера) лише для себе, використовуючи файл хостів.
Дан Гроссман

у вас є кілька імен для обробки або лише одне? як ви можете працювати (визначити Virtualhosts) з іменами Або з IP-адресою.
regilero

якась конкретна причина, чому інший документ корінь?
anthonysomerset

Висловлене обгрунтування ОП не має сенсу (холдингова сторінка чудово працює з перезаписом), але якщо ви, скажімо, переробляєте сайт, потрібен був спосіб розміщення перероблених матеріалів, і ви не знали, що існують піддомени, ви можете вирішити зробити це так.
живіт

Ви можете використовувати рядки "Дозволити / Заборонити", щоб заблокувати доступ для всіх, крім вас, і мати власний документ про помилку для 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

Або щось подібне. :)


Я б сказав, що це буде найменш гіршим варіантом.
живіт

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>

Зауважте, хоча це, мабуть, буде трохи чистіше, щоб впоратися з цим піддоменом 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]що означає "перехід". Без нього фактичне перенаправлення 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запитами ! Усі POSTs мовчки змінюються, 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

Як сказав @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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.