Apache 하위 도메인 구성이 작동하지 않습니다.

Apache 하위 도메인 구성이 작동하지 않습니다.

다른 사람이 구성한 Debian 6 서버가 있습니다. 해당 서버에 하위 도메인을 추가하라는 요청을 받았습니다.

DNS를 올바르게 구성하고( 로 확인 nslookup) 디렉토리를 생성한 /var/www/다음 새 가상 호스트를 추가했습니다 /etc/apache2/sites-available(실제로 기존 하위 도메인 파일 중 하나를 복사하여 편집했습니다).

<VirtualHost *:80>
    DocumentRoot "/var/www/mysub.example.com"
    ServerName mysub.example.com
    ServerAlias www.mysub.example.com

    ErrorLog ...[path to file]
    CustomLog [path to file]

    RewriteEngine On 
    #RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
    #RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]

    <Directory /var/www/mysub.example.com>
         AllowOverride All
         Require all granted
    </Directory>
</VirtualHost>

그런 다음 Apache를 사용하여 호스트를 추가 a2ensite하고 다시 시작했지만 도메인이 베타 프로덕션 사이트 mysub.example.com로 리디렉션됩니다 . 이상한 점은 in beta.example.com에 대한 구성이 없다는 것입니다 .beta.example.com/etc/apache2/sites-available

이 하위 도메인을 활성화하려면 또 어떻게 해야 합니까? example.com호스트 구성이 아무것도 차단하지 않는다고 확신합니다 . blog.example.com가상 호스트도 그런 식으로 구성되어 있고 완벽하게 작동하기 때문입니다.

편집하다

일부 디버그 출력:

root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443                  beta.example.com (/etc/apache2/sites-enabled/01-example.com:18)
*:80                   is a NameVirtualHost
         default server beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
         port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
         port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
         port 80 namevhost [here comes other unrelated domain name]
         port 80 namevhost forum.example.com (/etc/apache2/sites-enabled/04-forum.example.com:1)
         port 80 namevhost example.com (/etc/apache2/sites-enabled/05-sth.example.com:1)
         port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/06-mysub.example.com:1)
Syntax OK


root@xxx:~# grep -r 'mysub\.example\.com' /etc/apache2
/etc/apache2/apache2.conf:Alias /mysub /var/www/mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com:        DocumentRoot "/var/www/mysub.example.com"
/etc/apache2/sites-available/06-mysub.example.com:        ServerName mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com:        ServerAlias www.mysub.example.com
/etc/apache2/sites-available/06-mysub.example.com:        ErrorLog "/var/log/apache2/mysub.example.com-error_log"
/etc/apache2/sites-available/06-mysub.example.com:        CustomLog "/var/log/apache2/mysub.example.com-access_log" common
/etc/apache2/sites-available/06-mysub.example.com:        #RewriteCond %{HTTP_HOST} ^mysub.example.com$ [NC]
/etc/apache2/sites-available/06-mysub.example.com:        #RewriteRule ^(.*)$ http://www.mysub.example.com$1 [R=301,L]
/etc/apache2/sites-available/06-mysub.example.com:        <Directory /var/www/mysub.example.com>

root@xxx:~# grep -r 'beta\.example\.com' /etc/apache2
/etc/apache2/sites-available/01-example.com:        ServerName beta.example.com
/etc/apache2/sites-available/01-example.com:        ServerAlias www.beta.example.com
/etc/apache2/sites-available/01-example.com:        ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com:        CustomLog "/var/log/apache2/beta.example.com-access_log" common
/etc/apache2/sites-available/01-example.com:        ServerName beta.example.com:443
/etc/apache2/sites-available/01-example.com:        ServerAlias www.beta.example.com:443
/etc/apache2/sites-available/01-example.com:        ErrorLog "/var/log/apache2/beta.example.com-error_log"
/etc/apache2/sites-available/01-example.com:        CustomLog "/var/log/apache2/beta.example.com-access_log" common

편집 2 빠른 테스트를 해봤습니다. beta.example.com다음을 사용하여 첫 번째 가상 호스트( ) 를 비활성화했습니다 .

a2dissite 01-example.com

그런 다음 액세스를 시도했고 mysub.example.com이제 리디렉션되었습니다 blog.example.com. 이는 활성화된 사이트 순서에서 두 번째입니다. 따라서 이(가) 발견되지 않은 것처럼 보이며 찾은 하위 도메인 mysub.example.com의 첫 번째 저장소에 속합니다 .*.example.com

편집 2

또 다른 테스트: 새 하위 도메인이 첫 번째(기본) 하위 도메인이 되도록 구성 파일의 순서를 변경했습니다. 지금 바로:

root@xxx:~# apachectl -S
VirtualHost configuration:
wildcard NameVirtualHosts and _default_ servers:
*:443                  beta.example.com (/etc/apache2/sites-enabled/01-example.com:14)
*:80                   is a NameVirtualHost
         default server mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
         port 80 namevhost mysub.example.com (/etc/apache2/sites-enabled/00-mysub.example.com:1)
         port 80 namevhost beta.example.com (/etc/apache2/sites-enabled/01-example.com:1)
         port 80 namevhost blog.example.com (/etc/apache2/sites-enabled/02-blog.example.com:1)
Syntax OK

그래도 입력하려고 하면 mysub.example.com로 리디렉션됩니다 beta.example.com. 여전히 blog.example.com완벽하게 작동합니다.

/etc/apache2/sites-available다른 곳( 디렉토리 외에) 에 정의된 도메인 구성이 있을 가능성이 있습니까 ?

편집 3

호스트에 대한 추가 구성: beta.example.com 및 blog.example.com

beta.example.com (파일: /etc/apache2/hosts-available/01-example.com )

<VirtualHost *:80>
        DocumentRoot "/var/www/example.com"
        ServerName beta.example.com
        ServerAlias www.beta.example.com

        ErrorLog "/var/log/apache2/beta.example.com-error_log"
        CustomLog "/var/log/apache2/beta.example.com-access_log" common

        <Directory /var/www/example.com>
                AllowOverride All
        </Directory>
</VirtualHost>

<VirtualHost *:443>
        DocumentRoot "/var/www/example.com"
        ServerName beta.example.com:443
        ServerAlias www.beta.example.com:443

        ErrorLog "/var/log/apache2/beta.example.com-error_log"
        CustomLog "/var/log/apache2/beta.example.com-access_log" common

        RewriteEngine On
        #RewriteCond %{HTTP_HOST} ^example.com$ [NC]
        #RewriteRule ^(.*)$ http://www.example.com$1 [R=301,L]

        SSLEngine on
        SSLCertificateFile /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key

        <Directory /var/www/example.com>
                AllowOverride All
        </Directory>
</VirtualHost>

blog.example.com (파일: /etc/apache2/hosts-available/02-blog.example.com )

<VirtualHost *:80>
    DocumentRoot "/var/www/blog.example.com"
    ServerName blog.example.com
    ServerAlias www.blog.example.com

    ErrorLog ...[path to file]
    CustomLog [path to file]

    RewriteEngine On 
    #RewriteCond %{HTTP_HOST} ^blog.example.com$ [NC]
    #RewriteRule ^(.*)$ http://www.blog.example.com$1 [R=301,L]

    <Directory /var/www/blog.example.com>
         AllowOverride All
         Require all granted
    </Directory>
</VirtualHost>

답변1

c4f4t0r이 말했듯이 "apache2ctl -S"를 시도한 후 .htaccess 파일 내에서 다시 쓰기 규칙을 찾아보십시오. 예를 들어 다음과 같이 모든 파일을 디버깅하는 것이 좋습니다.

find /var/www/mysub.example.com -name ".htaccess" -exec grep -l -i rewrite {} \;

기본 구성 파일에는 "위험한" 내용이 있습니다.

<Directory /var/www/mysub.example.com>
     AllowOverride All # <---- THIS
     Require all granted 
</Directory>

답변2

파일을 확인 하고 근처의 /etc/apache2/ports.conf줄을 살펴 봐야 합니다.NameVirtualHost *:80Listen 80

이 줄이 없으면 ServerName 기반의 가상 호스트를 사용할 수 없으므로 브라우저에서 항상 첫 번째로 활성화된 가상 호스트를 얻는 것이 정상입니다.

답변3

문제(및 해결책)는 매우 간단했습니다.

문제는 새로 생성된 하위 도메인의 폴더가 비어 있다는 것입니다. 즉, index.php/html 파일이 없습니다. 따라서 서버는 이를 (디렉터리로) 표시하는 대신 기본 도메인으로 리디렉션되었습니다.beta.example.com

따라서 가상 호스트의 구성이 정확했으며 폴더에 일부 파일을 추가한 후 하위 도메인이 작동하도록 구성되었습니다.

관련 정보