У меня два домена - oliverhaslam.com и ojhaslam.co.uk.
Оба зарегистрированы в одной компании, и у обоих есть записи A, указывающие на IP-адрес моего сервера.
У обоих также есть записи CNAME, указывающие адрес www на эквивалентный адрес без www (от www.oliverhaslam.com до oliverhaslam.com и т. Д.)
Проблема в следующем: в то время как www.oliverhaslam.com перенаправляет на oliverhaslam.com и отображает его в адресной строке браузера, www.ojhaslam.co.uk направляет на правильный IP-адрес, а не на ojhaslam.co.uk.
Добавление серверов www.ojhaslam.co.uk к моим виртуальным хостам позволяет корректно отображать контент в браузере, но адресная строка не отражает перенаправление на ojhaslam.co.uk. Как я уже сказал, это не то поведение, которое я наблюдаю с oliverhaslam.com, и я боюсь, что SEO и т. Д. Будут рассматривать www.ojhaslam.co.uk и ojhaslam.co.uk как два отдельных сайта.
Вот мой файл httpd.conf:
<VirtualHost *:80>
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
DocumentRoot /var/www/
</VirtualHost>
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias ojhaslam.co.uk
DocumentRoot /var/www/photo365/
</VirtualHost>
Любые идеи, почему два домена, настроенные одинаково у регистратора и настроенные одинаково в httpd.conf, действуют по-разному?
Спасибо.
РЕДАКТИРОВАТЬ:
Теперь у меня это работает, изменив приведенный выше код на:
<VirtualHost *:80>
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
DocumentRoot /var/www/
</VirtualHost>
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias ojhaslam.co.uk
#RedirectMatch permanent /(.*) http://ojhaslam.co.uk/$1
DocumentRoot /var/www/photo365/
</VirtualHost>
<VirtualHost *:80>
ServerName www.ojhaslam.co.uk
ServerAlias www.ojhaslam.co.uk
RedirectMatch permanent /(.*) http://ojhaslam.co.uk/$1
DocumentRoot /var/www/photo365/
</VirtualHost>
Однако остается вопрос - почему он работал для одного домена, а для другого - нет?
Запись CNAME предназначена не для перенаправления, а для имитации другой записи.
Вам нужно сказать клиенту, что нужно перенаправить. Этого можно достичь:
1) создание новых хостов для www.
имена и используя Redirect
директива, например:
<VirtualHost *:80>
ServerName www.ojhaslam.co.uk
...
Redirect ojhaslam.co.uk
</VirtualHost>
2) используя mod_rewrite
:
<VirtualHost *:80>
ServerName ojhaslam.co.uk
ServerAlias www.ojhaslam.co.uk
...
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^ http://%1%{REQUEST_URI} [L,R=301]
</VirtualHost>
Вы получили достаточно ответов о том, как исправить это в своем httpd.conf
, поэтому я больше не буду вдаваться в это.
Остается вопрос, почему это сработало вначале.
Что случилось, когда вы пошли в www.oliverhaslam.com
? Ваш DNS-сервер вошел в свои записи и увидел, что это CNAME для oliverhaslam.com
и обслужил ваш браузер с записью A для oliverhaslam.com
, будучи чем-то вроде 1.2.3.4
.
Хорошо, давайте пока отложим это дело, мы вернемся к нему позже. Сейчас www.ojhaslam.co.uk
. Был воспроизведен тот же сценарий, когда DNS-сервер также вернулся с правильным IP-адресом, будучи 1.2.3.4
.
Затем запрос приходит на IP 1.2.3.4
в Apache. Apache получает запрос на один из своих IP-адресов, видит, что это виртуальный хост на основе имени, и пытается найти соответствующий VirtualHost
-блок в вашей конфигурации. И что за хрень, не может найти! Нет совпадений www.oliverhaslam.com и www.ojhaslam.co.uk. Так что он делает? Это идет в дефолт виртуальный хост. Что, согласно документация:
Теперь, когда поступает запрос, сервер сначала проверяет, использует ли он IP-адрес, соответствующий NameVirtualHost. Если это так, он будет просматривать каждый раздел с совпадающим IP-адресом и пытаться найти тот, в котором ServerName или ServerAlias совпадает с запрошенным именем хоста. Если он его находит, он использует конфигурацию для этого сервера. Если соответствующий виртуальный хост не найден, то первый перечисленный будет использоваться виртуальный хост, соответствующий IP-адресу.
И вот ваше объяснение. Оба www-сайта обслуживались первым блоком VirtualHost, который был oliverhaslam.com
.
Ваш псевдоним в вашей конфигурации абсолютно бесполезен:
ServerName oliverhaslam.com
ServerAlias oliverhaslam.com
Вы используете псевдоним основного сервера. Это как сказать: «Привет, меня зовут Оливер. Но ты можешь звать меня Оливер». Он дублируется и поэтому не нужен. Для целей SEO просто перепишите свой домен www на его эквивалент, отличный от www, используя следующие строки:
# Redirect www to non-www (SEO optimization)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.oliverhaslam\.com$ [NC]
RewriteRule ^/(.*)$ http://oliverhaslam.com/$1 [L,R=301]
И для вашего дополнительного домена:
# Redirect www to non-www (SEO optimization)
RewriteEngine on
RewriteCond %{HTTP_HOST} ^www\.ojhaslam\.co\.uk$ [NC]
RewriteRule ^/(.*)$ http://ojhaslam.co.uk/$1 [L,R=301]
Это должно позаботиться о правильном перенаправлении (с использованием перенаправления 301).