ServerAlias not working
У меня есть VPS, который я настроил для размещения нескольких веб-сайтов с хостингом на основе имен. Это все хорошо, только используя example.com и www.example.com. Он также работает с example.net, но когда я пробую example.net, он возвращается к конфигурации моего сайта по умолчанию, которая просто показывает мою страницу index.html по умолчанию (пустую).
Вот файл по умолчанию:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
<Directory "/usr/lib/cgi-bin">
AllowOverride None
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
Order allow,deny
Allow from all
</Directory>
ErrorLog /var/log/apache2/error.log
# Possible values include: debug, info, notice, warn, error, crit,
# alert, emerg.
LogLevel warn
CustomLog /var/log/apache2/access.log combined
Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
Options Indexes MultiViews FollowSymLinks
AllowOverride None
Order deny,allow
Deny from all
Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>
</VirtualHost>
Вот конфигурация для сайта example.com:
<VirtualHost *:80>
ServerAdmin admin@example.com
ServerName example.com
ServerAlias www.example.com
DocumentRoot /srv/www/example.com/public_html/
ErrorLog /srv/www/example.com/logs/error.log
CustomLog /srv/www/example.com/logs/access.log combined
<Directory /srv/www/example.com/public_html/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
А вот конфиг для сайта example.net:
<VirtualHost *:80>
ServerAdmin admin@example.net
ServerName example.net
ServerAlias www.example.net
DocumentRoot /srv/www/example.net/public_html/
ErrorLog /srv/www/example.net/logs/error.log
CustomLog /srv/www/example.net/logs/access.log combined
<Directory /srv/www/example.net/public_html/>
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
Где может быть проблема?
Я считаю, что что-то идет не так со свойством ServerAlias.
Может ли это быть из-за способа создания сайта? Потому что example.com - это сайт Joomla, а example.net - это сайт Zend Framework. На всякий случай я также вставлю файлы.htaccess для example.net, так как example.com отключен:example.net:
SetEnv APPLICATION_ENV development
RewriteRule ^(browse|config).* - [L]
ErrorDocument 500 /error-docs/500.shtml
SetEnv CACHE_OFFSET 2678400
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf)$">
Header set Expires "Fri, 25 Sep 2037 19:30:32 GMT"
Header unset ETag
FileETag None
</FilesMatch>
RewriteEngine On
RewriteRule ^(adm|statistics) - [L]
RewriteRule ^/public/(.*)$ http://example.net/$1 [R]
RewriteRule ^(.*)$ public/$1 [L]
Любая помощь будет принята с благодарностью!
Редактировать Так что мой вопрос абсолютно ясен: проблема в том, что один сайт работает как с префиксом www, так и без него, а второй - нет. Я хотел бы знать, как включить работу второго сайта с префиксом www.
3 ответа
Убедитесь, что порядок приоритета в директивах конфигурации совпадает с тем, как Apache должен обрабатывать запрос - т.е. вам не повезет, если ваши директивы загрузятся следующим образом:
- example.com
- по умолчанию / всеохватывающий
- universal.lv
Неважно, объявлены ли они в одном файле или нескольких файлах - до тех пор, пока "universal.lv" является последним, оно не будет достигнуто, потому что vhost по умолчанию /catch-all будет предшествовать ему.
Я обычно называю свою конфигурацию по умолчанию /catch-all "z-default.conf" (или, если у вас есть домен, начинающийся с "z", "zz" ... и т. Д.) По этой причине, чтобы убедиться, что он обрабатывается, только если нет другого совпадения с vhost
Попробуйте переименовать соответственно.
Обновлено: чтобы не путать с _default_
Директива VirtualHost
Используя подстановочный DNS, чтобы перенаправлять все запросы на example.com на IP-адрес сервера (перехватывает поддомен с неверным ключом), Apache анализирует следующие файлы конфигурации:
- 000-default.conf -
VirtualHost _default_:80
/ServerName <hostname>
- перехватывать запросы к IP-адресу сервера (можно перенаправить на основной домен или просто заблокировать по умолчанию)Directory
указано вconf.d/security
) - example.conf -
VirtualHost *:80
/ServerName www.example.com
- example2.conf -
VirtualHost *:80
/ServerName www.example2.com
- zzz-example.conf -
VirtualHost *:80
/ServerName example.com
/ServerAlias *.example.com
- перенаправляет на канонический домен www - zzz-example2.conf -
VirtualHost *:80
/ServerName example2.com
/ServerAlias *.example2.com
- перенаправляет на канонический домен www
Как задокументировано, Apache выбирает первый соответствующий VirtualHost (т.е. _default_:80
) но это поведение не желательно, если вы используете подстановочный знак в ServerAlias
директивы.
Я рекомендую вам сначала прочитать документацию Apache по виртуальным хостам.
Отличный пример был приведен на http://httpd.apache.org/docs/2.2/vhosts/name-based.html:
NameVirtualHost *:80
<VirtualHost *:80>
ServerName www.domain.tld
ServerAlias domain.tld *.domain.tld
DocumentRoot /www/domain
</VirtualHost>
<VirtualHost *:80>
ServerName www.otherdomain.tld
DocumentRoot /www/otherdomain
</VirtualHost>
Обратите внимание на часть NameVirtualHost. Ваш журнал ошибок (/var/log/apache2/error.log) должен был предупредить вас, что вы допустили возможную ошибку.
Примечание: после изменения файла конфигурации Apache необходимо перезапустить.
Вам нужно включить NameVirtualHost в httpd.conf - тогда вы можете определить несколько виртуальных хостов на одном и том же ip: порту.