
다른 사람이 구성한 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 *:80
Listen 80
이 줄이 없으면 ServerName 기반의 가상 호스트를 사용할 수 없으므로 브라우저에서 항상 첫 번째로 활성화된 가상 호스트를 얻는 것이 정상입니다.
답변3
문제(및 해결책)는 매우 간단했습니다.
문제는 새로 생성된 하위 도메인의 폴더가 비어 있다는 것입니다. 즉, index.php/html 파일이 없습니다. 따라서 서버는 이를 (디렉터리로) 표시하는 대신 기본 도메인으로 리디렉션되었습니다.beta.example.com
따라서 가상 호스트의 구성이 정확했으며 폴더에 일부 파일을 추가한 후 하위 도메인이 작동하도록 구성되었습니다.