* source * IP 기반의 Apache 가상 호스트 : 소스

소스 IP를 기반으로 다른 가상 호스트에 대해 Apache를 구성 할 수 있습니까? (예 : 소스 IP를 기준으로 동일한 인터페이스, 동일한 호스트 이름, 그러나 다른 컨텐츠를 가진 두 개의 다른 가상 호스트 )

이것에 대한 동기는 내 IP 주소가 사이트에 올바르게 액세스 할 수 있지만 다른 모든 사람들이 보유 페이지를 얻도록하는 것입니다. 일반적인 해결책은 mod_rewrite를 사용하여 방문자를 동일한 docroot 내의 별도의 페이지로 안내하는 것 같지만 보류 페이지에 대해 완전히 다른 docroot를 대신 사용하고 싶습니다.



답변

아파치 수준에서 (mod_rewrite없이) 어쨌든 가능한지 모르겠습니다.

다른 아이디어가 있습니다. 두 개의 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

또는 비슷한 것. 🙂


답변

실제로 다른 가상 호스트는 아닙니다. 그러나 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 하위 도메인으로 처리하는 것이 약간 더 깨끗할 수 있습니다.


답변

아파치 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>

아파치 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 항목이 포함됩니다.

<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의 IP 주소에서 포트 1222로 요청을 라우팅 할 수 있습니다 .

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

변경 -A하는 -D규칙을 제거합니다.

워드 프로세서가 추가 추가 할 필요가 제안합니다 ListenNameVirtualHost명령을하지만 실제로는 그들없이 작동하는 것을 발견하고,이를 추가하는 것이 (적어도 우분투에서) 휴식했다.


답변

AFAIK를 수행하는 유일한 방법은 문서 루트 내의 위치를 ​​문서 루트 외부의 컨텐츠에 심볼 링크 한 다음 요청을 다시 작성하는 것입니다.


답변

@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