общая массивная конфигурация vhost вызывает код состояния 404 при каждом запросе vhost

общая массивная конфигурация vhost вызывает код состояния 404 при каждом запросе vhost

Я пытаюсь настроить сервер Apache 2.4 с массивными поддоменами с помощью ServerAlias. Базовая конфигурация для основного домена работает просто отлично (основной домен => 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 minimum. Как вы уже могли предположить, настоящее доменное имя здесь изменено на example.com. Любая помощь в этом вопросе была бы замечательной.

Редактировать: Как я уже сказал ниже в своем комментарии к первому ответу, мне нужно решение, которое не обязательно требует ничего RewriteRuleв конфигурации vhost. Поскольку я использую системы php, которые имеют свои собственные (иногда очень сложные) RewriteRules, поэтому я не хочу иметь проблем с этим .htaccess. Но возможны любые другие варианты, кроме cgi. И да, поддержка символических ссылок включена (или ее можно включить).


Редактировать:

Пример с символической ссылкой помог мне понять основную идею. Немного переосмысления привело меня к следующему решению. Правило first found всегда применяется, поэтому оно сработало для меня:

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

Редактировать:

Вы можете добавить перенаправление в конфигурацию vhost, если не хотите делать это в .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

Связанный контент