일반적인 대규모 가상 호스트 구성으로 인해 모든 가상 호스트 요청에 대해 404 상태 코드가 발생함

일반적인 대규모 가상 호스트 구성으로 인해 모든 가상 호스트 요청에 대해 404 상태 코드가 발생함

ServerAlias를 사용하여 다수의 하위 도메인이 있는 Apache 2.4 서버를 설정하려고 합니다. 기본 도메인의 기본 구성은 정상적으로 작동합니다(기본 도메인 => 200, 모든 하위 도메인 => 404).

UseCanonicalName Off

<VirtualHost example.com>
        ServerName example.com
        ServerAlias www.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
        DirectoryIndex index.php index.html

        <Directory />
                Options +Indexes +FollowSymLinks +Includes
                <IfModule !mod_access_compat.c>
                        Require all granted
                </IfModule>
                <IfModule mod_access_compat.c>
                        Order allow,deny
                        Allow from all
                </IfModule>
                AllowOverride All
        </Directory>
</VirtualHost>

그러나 일반 가상 호스트 설정 행을 추가하면 웹 서버는 모든 가상 호스트(하위 도메인) 요청에 대해 404 상태 코드를 반환합니다.

UseCanonicalName Off

<VirtualHost example.com>
        ServerName example.com
        ServerAlias www.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/httpdocs"
        DirectoryIndex index.php index.html
        ServerAlias *.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/%1.0"
        DirectoryIndex index.php index.html

        <Directory />
                Options +Indexes +FollowSymLinks +Includes
                <IfModule !mod_access_compat.c>
                        Require all granted
                </IfModule>
                <IfModule mod_access_compat.c>
                        Order allow,deny
                        Allow from all
                </IfModule>
                AllowOverride All
        </Directory>
</VirtualHost>

올바른 폴더 경로로 뭔가를 해야 한다고 생각합니다. 폴더 경로는 항상 다음과 같습니다.

/var/www/vhosts/maindomain.com/subdomain.maindomain.com

나에게 필요한 것은 기본 도메인과 그에 연결된 일반 하위 도메인과 일치하는 구성뿐입니다. 그래서,

www.example.com
example.com

일치 폴더 경로:

/var/www/vhosts/example.com/httpdocs

그리고

ci.example.com
tracker.example.com
other.example.com

아래와 같이 폴더 경로가 일치해야 합니다.

/var/www/vhosts/example.com/ci.example.com
/var/www/vhosts/example.com/tracker.example.com
/var/www/vhosts/example.com/other.example.com

그리고 이상한 이유로 하위 도메인 경로로 변경하면 %0.0하위 도메인은 작동하지만 기본 도메인은 작동하지 않습니다. 따라서 그것을 사용할 때는 그 반대가 됩니다. 기본 도메인 => 404, 모든 하위 도메인 => 200.

Apache 2.4 문서에서 폴더 이름에 대한 마법 문자열 리터럴에 대한 설명을 찾았습니다.http://httpd.apache.org/docs/2.4/mod/mod_vhost_alias.html 하지만 문제를 해결하기는커녕 점점 더 혼란스러워졌습니다...

웹 서버는 openSUSE 42.2 최소 버전에서 실행됩니다. 귀하가 제안한 대로 실제 도메인 이름이 로 변경되었습니다 example.com. 이 문제에 대한 도움이 필요합니다.

편집: 아래 첫 번째 답변에 대한 내 의견에서 말했듯이 RewriteRule가상 호스트 구성에 반드시 아무것도 필요하지 않은 솔루션이 필요합니다. 나는 PHP 시스템을 사용하고 있기 때문에 그들만의 (때때로 매우 복잡한) 시스템을 갖고 있기 때문에 그런 문제에 휘말리고 RewriteRule싶지 않습니다 . .htaccess그러나 다른 옵션도 cgi가능합니다. 예, 심볼릭 링크 지원이 활성화되어 있습니다(또는 활성화할 수 있습니다).


편집하다:

심볼릭 링크 예제는 기본 개념을 이해하는 데 도움이 되었습니다. 잠시 고민한 끝에 다음과 같은 해결책을 생각해 냈습니다. 발견된 첫 번째 규칙은 항상 적용되므로 나에게 적합합니다.

UseCanonicalName Off
<VirtualHost *:80>
        DocumentRoot "/var/www/vhosts/example.com/httpdocs"
        ServerName www.example.com
        ServerAlias example.com
        <Directory />
                Options Indexes FollowSymLinks Includes ExecCGI
                AllowOverride All
                Require all granted
                Allow from all
        </Directory>
</VirtualHost>

<VirtualHost *:80>
        DocumentRoot "/var/www/vhosts/example.com/httpdocs"
        ServerName example.com
        ServerAlias *.example.com
        VirtualDocumentRoot "/var/www/vhosts/example.com/%1"
        <Directory />
                Options Indexes FollowSymLinks Includes ExecCGI
                AllowOverride All
                Require all granted
                Allow from all
        </Directory>
</VirtualHost>

apachectl -t그리고 apachectl -S그것은 중요하지 않다고 말했습니다. 테스트를 거쳐 작동합니다! :-)

답변1

노력하다

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/vhosts/example.com/httpdocs
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/vhosts/example.com/%0
</VirtualHost>

여기에는 전체 구성이 포함되지 않지만 와일드카드 하위 도메인이 작동하게 해야 합니다.

다음 www.example.com으로 모든 요청을 example.com. 가장 쉬운 방법은 아마도 htaccess 파일을 사용하는 것입니다./var/www/vhosts/example.com/www.example.com

또는 심볼릭 링크가 켜져 있는 경우 다음 /var/www/vhosts/example.com/www.example.com에 심볼릭 링크를 설정할 수 있습니다./var/www/vhosts/example.com/httpdocs

편집하다:

들어가고 싶지 않다면 .htaccess다음을 시도해 보세요.

<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /var/www/vhosts/example.com/httpdocs
    ServerAlias *.example.com
    VirtualDocumentRoot /var/www/vhosts/example.com/%0
    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^www.example.com
    RewriteRule ^/(.*)$ http://example.com/$1 [L,R=301]
</VirtualHost>

일종의 리디렉션 없이는 이 작업을 수행할 수 있는 방법이 없습니다. 또한 www가 아닌 ​​항목을 www로 리디렉션하거나 www가 아닌 ​​항목을 www가 아닌 ​​항목으로 리디렉션하는 것도 좋은 습관입니다. SEO 작업을 수행하려는 경우 웹 사이트와 본질적으로 중복되는 콘텐츠를 갖는 것은 해로울 수 있습니다.

답변2

나는 나 자신을 위해 스크립트를 작성했습니다. 이것은 나에게 효과적입니다 :)

하지만 내 대본을 읽기 전에 - 내 팁은 사용하지 말라는 것입니다.

<VirtualHost example.com>
....
</VirtualHost>

<VirtualHost *:80>대신 다음을 사용하여 <VirtualHost *>VirtualHost 항목을 시작하십시오 .

참고: 저는 주로 AIX에서 작업하므로 ksh를 셸로 사용합니다. 이는 /bin/sh 또는 /bin/bash에서 작동합니다.

Syntax:
vhost.ksh <ServrName> [ServerAlias1] [... ServerAliasN]

#!/usr/bin/ksh
# Copyright AIXTOOLS.NET, 2014
# This script creates a vhost template
# under the assumption that the site might be served by multiple hosts
# the logs are put into a sub-directory
# ${SITEroot}/logs/LOGNAME.$host
site=$1
shift
alias=$*
HOST=`hostname -s`
SITE=/var/httpd/${site}
LOGDIR=${SITE}/logs

cat -<<EOF1
# AIXTOOLS.NET vhost.ksh output
# VirtualHost template for ${site}
# SITEBASE=${SITE}
# LOGDIR=${LOGDIR}

<VirtualHost *:80>
     ServerName  ${site}
EOF1
for name in ${alias}
do
print "    ServerAlias  ${name}"
done

cat - <<EOF2

DocumentRoot "${SITE}/htdocs"

<Directory "/var/httpd/${site}/htdocs">
    Options Indexes FollowSymLinks Includes
    AllowOverride All
    Order allow,deny
    Allow from all
</Directory>

#Logs for ${site}
# combined is chosen as default to support awstats reporting
    CustomLog "${LOGDIR}/access_log.${HOST}" combined
#    ErrorLog "${LOGDIR}/error_log.${HOST}"
# You can consider using different "localN" syslogs to split different vhosts
# should you need that
    ErrorLog syslog:user
#    LogLevel alert rewrite:trace3
#    LogLevel alert
#    RewriteLog "/var/httpd/${site}/logs/rewrite.log"
#    RewriteLogLevel 0
</VirtualHost>
EOF2

관련 정보