아파치 기본 / 캐치-모든 가상 호스트?


67

domain1.com, domain2.com 및 domain3.com이라는 3 개의 도메인이있는 경우 기본 가상 호스트를 목록에없는 도메인으로 설정할 수 있습니까? 예를 들어 다음과 같은 경우

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain1
ServerName domain1
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/domain2
ServerName domain2
ServerAlias host
</VirtualHost>

<VirtualHost 192.168.1.2 204.255.176.199>
DocumentRoot /www/docs/everythingelse
ServerName *
ServerAlias host
</VirtualHost>

도메인을 등록하고 내 서버를 가리키면 기본적으로 domain3과 동일하게 표시됩니다. 가능합니까?

답변:


45

예. ServerAlias가 "*"여야하고 ServerName이 실제 호스트 이름으로 설정되어 있어야합니다. VirtualHost가 가장 최근에로드되었는지 확인해야 할 수도 있습니다.


작동하지만 작동하지 않습니다. 도메인이 구체적으로 표시되지 않으면 "Firefox에서 서버를 찾을 수 없습니다"라는 메시지가 나타납니다.
SJaguar13.

2
"ServerName host"및 "ServerAlias ​​*"로 설정 했습니까? 원래 이것을 충분히 강조하지는 않았지만 ServerName은 와일드 카드를 사용하지 않으며 ServerAlias ​​만 사용합니다. ServerName은 실제 호스트 이름이어야합니다.
freiheit

또한 다른 가상 호스트가 작동합니까? 어떤 버전의 아파치?
freiheit

"Firefox가 서버를 찾을 수 없습니다." 아파치 문제가 아닙니다. 더 자세한 정보가 필요합니다 (연결된 서버, 오류 코드는 무엇입니까 ...)
Law29

나를 위해 작동하지 않는 이상한, 그것은 항상 호스트 헤더에 관계없이 첫 번째
가상

80

이름 기반 가상 호스트를 사용하는 경우로드 된 첫 번째 가상 호스트 구성이 기본값이됩니다 (소스 : Apache Wiki ). 예를 들어 아래 구성에서 일치하지 않는 도메인은 다음과 일치합니다 domain-one.com.

NameVirtualHost *:80

<VirtualHost *:80>
  ServerName domain-one.com
  # Other options and directives ..
</VirtualHost>

<VirtualHost *:80>
  ServerName domain-two.com
  # Other options and directives ..
</VirtualHost>

많은 서버에는 단일 구성 파일이 없지만 다음과 같이 구성된 여러 호스트 별 구성 파일이 있습니다.

/etc/apache2
|-- sites_available  (actual configuration files)
`-- sites_enabled    (symlinks to files in sites_available)

이 경우 특정 가상 호스트 구성을 먼저로드하려면 심볼릭 링크의 이름을 다음과 같이 정렬 할 때 첫 번째로 바꿉니다 00-default.


다른 답변 중 일부는 정확하지 않습니다. Apache Wiki에 따르면 가상 호스트에서 a를 설정하지 않으면ServerName 올바르지 않습니다. a ServerName가없는 호스트 가 먼저로드되지 않으면,로드 된 첫 번째 호스트가 기본값이므로 Apache는 절대 사용할 수 없습니다.

또한 ServerAlias *실제로는 아무 것도 일치 하지만 나중에 정의 된 다른 가상 호스트를 무시할 수도 있습니다. 그것은 항상 있다면 아마이 방법은 일하는 것이 마지막 (질문에 주어진 구성으로) 정의 할 가상 호스트, 그러나 이것은 새로운 지침을 추가하는 의미 마찬가지로 위의 순서를 변경하는 대신 정렬 순서를 변경.


당신에게 + 백만 인터넷 + 선생님! 기본값이되어야합니다.
Ryan

httpd.conf 또는 conf.d / xyz.conf 중 어느 것이 먼저 오는지 알고 있습니까?
Esa Varemo

2
"로드 된 첫 번째 가상 호스트 구성이 기본값입니다"는 XAMPP (Windows)의 로컬 SSL 도메인 관련 문제를 해결했습니다. 아파치는 각 포트에 대한 기본값으로 첫번째 가상 호스트를 사용하는 것처럼 제대로 무담보 / 보안 요구 모두에 대해 비 일치하는 도메인을 처리하기 위해, 80/443 포트 2 명시 적으로 "기본"CONFIGS가의 시작 부분에 정의가 있어야하므로이 보인다httpd-vhosts.conf
Wirone

1
@EsaVaremo-httpd.conf가 먼저로드되고 conf.d / xyz.conf (또는 conf.d / *)를 제공하는 Include 행이 있습니다. Include 라인 이전의 모든 구성 (vhost 포함)이 먼저 처리됩니다. 포함 라인 뒤의 모든 것은 포함 된 파일 다음에 처리됩니다.
Dan Pritts

7

서버 이름을 지정하지 않으면 기본 호스트가됩니다.

<VirtualHost *:80>
ServerAdmin webmaster@localhost

DocumentRoot /var/www
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>
<Directory /var/www/>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride None
    Order allow,deny
    allow from all
</Directory>
</VirtualHost> 

또한 주 httpd.conf 파일에서 DocumentRoot를 지정하지 않았는지 확인하십시오. 이는 vhost보다 우선합니다.


첫 번째 가상 호스트로 나열되어 있는데 "Firefox에서 서버를 찾을 수 없습니다."
SJaguar13

2
동의하지 않습니다. ServerName없이 첫 번째 가상 호스트를 설정했지만 일부 가상 호스트와 충돌하지만 다른 가상 호스트와 충돌하지 않는 것 같습니다. ServerName을 추가하여 서버에없는 임의의 도메인으로 설정하여 문제를 해결했습니다. 첫 번째 가상 호스트이므로 기본값으로 사용되지만 다른 ServerName과 일치하지 않는 도메인을 사용하는 경우에만 일치합니다.
joshaidan

3

순서는 중요합니다-다른 모든 것에 대한 호스트 정의를 목록의 헤드로 옮기십시오.


2

_default_ 가상 호스트를 사용하고 http://httpd.apache.org/docs/2.2/vhosts/examples.html에 지정된대로 httpd-vhosts.conf에 먼저 배치 하십시오.

"지정되지 않은 IP 주소 및 포트, 즉 다른 가상 호스트에 사용되지 않는 주소 / 포트 조합으로 모든 요청을 캐치하는 중 ... [...] 기본 호스트는 절대로 주소 / 포트로 전송 된 요청을 처리하지 않습니다. 요청에 알 수 없거나 Host : 헤더가없는 경우 항상 기본 이름 기반 가상 호스트 (해당 주소 / 포트의 가상 호스트는 구성 파일에서 처음으로 나타남)에서 제공됩니다. "

모든 가상 호스트를 포트 80에 고정시키는 라이브이지만 난독 화 된 httpd-vhosts.conf의 스 니펫 :

# Listen for virtual host requests on all IP addresses.
# This directive cannot be removed:
NameVirtualHost *:80

<VirtualHost _default_:80>
# This vhost catches client requests with host headers which have
# not been matched by ServerName or ServerAlias directives in other vhosts.
#
# We redirect all such requests to a particular named vhost:
    RewriteCond %{HTTP_HOST}    ^(.*)$
    RewriteRule ^(.*)$  http://my.site.of.choice [R=permanent,L]
</VirtualHost>

# Name based vhosts here:
<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName  my.other.site
    ServerAlias my.other.site2 my.other.site3
</VirtualHost>

# more vhosts etc...

vhost 일치 프로세스에 대한 자세한 설명은 여기 ( http://httpd.apache.org/docs/2.2/vhosts/details.html) 에서 찾을 수 있습니다 .


2
_default_일치하지 않는 IP에 대해서만 사용 되므로 와일드 카드 된 호스트 (* : 80)를 사용하면 절대 사용되지 않습니다.
Wirone

2

와일드 카드에는 사이트 구성 파일이 포함됩니다.

Include path/to/site/confs/*httpd.conf

사이트 conf 파일을 구성하여 예상 순서대로로드하십시오. 예...

01-httpd.conf

02-site1-httpd.conf

03-site2-httpd.conf

기타...

아파치는 이것을 순서대로 읽습니다. 그런 다음 일치하지 않는 가상 호스트를 잡아서 기본 사이트를로드하는 대신 404를 반환하기 위해 항상 마지막에로드 할 호스트를 생성하십시오.

99-catchall-httpd.conf

<VirtualHost *:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost *:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

httpd가 수신하는 포트로 포트를 교체하십시오. 또는 특정 인터페이스에서 httpd를 듣는 경우 대신 다음과 같이 각 인터페이스에 대해 catchall을 추가해야합니다.

<VirtualHost 192.168.1.101:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>
<VirtualHost 192.168.1.101:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8080>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

<VirtualHost 192.168.1.102:8443>
 ServerName null
 ServerAlias *
 Redirect 404 /
</VirtualHost>

도움이 되었기를 바랍니다. 이 방법을 사용하여 지정한 순서대로 사이트를로드하고 일치하지 않는 가상 호스트가 예기치 않은 사이트를 실수로로드하지 못하게합니다.


1

가장 좋은 해결책은 "1"로 시작하는 사이트 구성 파일의 이름을 바꾸어 먼저로드하고 이것이 기본 사이트가되도록하는 것입니다.

Apache2는 처음로드 된 vhost 파일을 기본 페이지로 만듭니다.


000-default이러한 이유로 기본 아파치 설치에도 가상 호스트가 있습니다.
vp_arth

0

<VirtualHost *:port>관심있는 호스트에 대해 ServerName / ServerAlias를 사용 하고 지정할 때 필요한 작업입니다.

내 상황에 대한 약간의 배경 :

ISP의 동적 IP 주소가 있으므로 IP 주소가 동적 IP 주소 등록 회사 (내 경우 noip.org)에 등록됩니다. 내 "호스트"중 하나는 DNS 등록시 myabc.example.com으로 CNAME으로 host1.ddns.net을 가리키는 것으로 등록해야했습니다. 그러나 host2.ddns.net은 그대로 남아 있습니다. myabc.example.com 및 host1.ddns.net이 site1로 이동하고 host2.ddns.net이 사이트 2로 이동하고 내 IP 주소를 포함하여 다른 것으로 이동하여 기본값으로 이동하기를 원했습니다.

첫 번째 conf의 파일 읽기, 즉 기본이 될 것입니다 000_def.conf, 001_site1.conf, 002_site2.conf와 순서대로 읽을 수 있습니다 000_def.conf기본 사이트로. (참고 : 내 경우, 나는 이러한 "파일"이 /etc/apache2/sites-enabled사실의 실제의 conf 파일에 대한 동적 링크가있는을 /etc/apache2/sites-available)

ServerName은 001_site1.conf 및 002_site2.conf에서 사용되므로 000_def.conf에서 무언가로 설정해야합니다.

# 000_def.conf:
<VirtualHost *:80>  
ServerName null
# NOTE: DO NOT USE "ServerAlias *" this seems to override the other conf files.
</VirtualHost>


# 001_site1.conf
<VirtualHost *:80>  
ServerName myabc.example.com
ServerAlias mylocalhostname host1.ddns.net
</VirtualHost>


# 002_site2.conf:
<VirtualHost *:80>  
ServerName host2.ddns.net
</VirtualHost>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.