Назад | Перейти на главную страницу

CNAME-перенаправления ведут себя по-разному для двух доменов

У меня два домена - 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).