소스 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
규칙을 제거합니다.
워드 프로세서가 추가 추가 할 필요가 제안합니다 Listen
및 NameVirtualHost
명령을하지만 실제로는 그들없이 작동하는 것을 발견하고,이를 추가하는 것이 (적어도 우분투에서) 휴식했다.
답변
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