Apache 구성 문제, 마지막으로 로드된 가상 호스트가 와일드카드 도메인이 됩니다.

Apache 구성 문제, 마지막으로 로드된 가상 호스트가 와일드카드 도메인이 됩니다.

/etc/httpd/conf.d/에 있는 2개의 별도 conf 파일에서 2개의 가상호스트를 로드했고, 브라우저에서 vhost1.test.com을 가리키면 vhost2.test.com index.html처럼 올바르게 로드됩니다. 그러나 웹 서버는 이제 두 번째 가상 호스트를 서버 와일드카드 도메인으로 응답하고 foo.test.com에 대한 DNS 항목을 생성하면 vhost2에 대한 페이지가 로드됩니다. vhost2의 구성을 삭제하면 vhost1에서도 동일한 동작이 발생합니다. 내 구성에서 마지막으로 로드된 가상 서버가 와일드카드 도메인이 되는 원인은 무엇입니까? 이 구성을 사용하면 브라우저에서 test.com을 가리키고 와일드카드를 로드할 때 Apache는 기본 문서 루트인 /var/www/html도 무시합니다. vhost.conf가 로드되지 않으면 /var/www/html의 문서가 예상대로 로드됩니다.

virtualhost1.conf

<VirtualHost *:80>
DocumentRoot /vhost1
ServerName vhost1.test.com
ErrorLog logs/vhost1-error_log
CustomLog logs/vhost1-access_log common
<Directory "/vhost1">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory>

virtualhost2.conf

<VirtualHost *:80>
DocumentRoot /vhost2
ServerName vhost2.test.com
ErrorLog logs/vhost2-error_log
CustomLog logs/vhost2-access_log common
<Directory "/vhost2">
order deny,allow
Require all granted
Allow from localhost 127.0.0.1 192.168.
</Directory> 

답변1

아파치 문서에서서버가 올바른 이름 기반 가상 호스트를 선택하는 방법

IP 및 포트 조합을 위한 기본 이름 기반 가상 호스트
가장 구체적으로 일치하는 IP 주소 및 포트 조합을 포함하는 가상 호스트 세트에서 일치하는 ServerName 또는 ServerAlias를 찾을 수 없는 경우 나열된 첫 번째 일치하는 가상 호스트가 사용됩니다.

따라서 DNS가 존재하지 않는 "foo.test.com"을 가리키면 HTTP 요청에 host: foo.test.comApache가 VHOST 중 하나와 일치할 수 없는 헤더 항목이 포함되므로 항상VHOST 컨테이너를 포함하는 첫 번째 파일.
파일은 알파벳순으로 나열되므로 첫 번째 파일이 알파벳순 목록에서 가장 낮은 파일이 됩니다.
따라서 실제로 VHOST(또는 더 중요하게는 해당 파일 이름)가 다음과 같은 경우:

  • 가상 호스트 1
  • 가상 호스트 2

가상 호스트 1Apache가 IP 주소나 호스트 이름으로 특정 VHOST에 대한 요청을 일치시킬 수 없는 경우 항상 해당 요청이 제공됩니다.

예, 처음 알게 되면 꽤 충격적입니다. 그렇기 때문에 일부 Apache 패키지는 파일 이름으로 기본 가상 호스트를 정의합니다 000_default_vhost.
이렇게 하면 요청이 VHOST의 호스트 이름이나 IP 불일치로 이루어진 경우 보장할 수 있습니다. VHOST는 항상 제공됩니다. 404가 포함된 요청은 확실히 "올바른" 도메인에 대한 것이 아니기 때문에
서버가 항상 요청을 거부하도록 서버를 구성하는 것을 고려해야 합니다 . 이것이 Apache에 대한 불합리한 동작처럼 보이면 nginx도 동일한 방식으로 동작한다는 점에 유의하십시오. nginx를 사용하고 서버 이름이 정의되지 않은 요청 처리를 방지하려는 경우000_default_vhost

요청만 삭제하는 서버를 정의할 수도 있습니다.

server {
    listen      80;
    server_name "";
    return      444;
}

알파벳순으로 먼저 나오는 파일에 넣으십시오./etc/nginx/sites-available/000_catchall

관련 정보