Я пытаюсь настроить сервер 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, которые имеют свои собственные (иногда очень сложные) RewriteRule
s, поэтому я не хочу иметь проблем с этим .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