Как я могу перенаправить совпадающие полные URL-адреса поддоменов, но заставить корневой поддомен переместиться в другое место, используя htaccess - PullRequest
0 голосов
/ 30 октября 2018

У меня есть куча старых URL-адресов из субдомена, который мне нужно перенаправить в другой субдомен и сохранить шаблон URL-адреса. Проблема, с которой я сталкиваюсь, заключается в том, чтобы заставить корневой поддомен перенаправить в другое место.

Для контекста, вот пример старой структуры URL:

https://oldsub.maindomain.com/2015/07/30/url-title/ 

Который мне нужно перенаправить на:

https://blog.maindomain.com/blog/2015/07/30/url-title/

Обратите внимание, что он должен быть направлен на новый поддомен blog, и после основного домена добавлен слаг blog.

Если кто-то посещает только корень старого субдомена (https://oldsub.maindomain.com/), мне нужно перенаправить его на структуру URL только на основном домене (https://maindomain.com/specific-url-title/)

У меня есть .htaccess в корне каталога поддоменов.

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^oldsub\. [NC]
RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC]
RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301]

RewriteCond %{HTTP_HOST} ^oldsub\.maindomain\.com$ [NC]
RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]

В .htaccess корневого домена у меня есть:

RewriteCond %{HTTP_HOST} 
RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/$1

Таким образом, старые сообщения в блоге перенаправляются правильно на blog.maindomain.com/blog/rest-of-url, но последние две строки не работают, так как старый запрос субдомена просто переходит также на blog.maindomain.com/blog.

Структура файла:

/public_html (maindomain.com)
  .htaccess
/oldsub.maindomain.com (oldsub.maindomain.com)
  .htaccess

blog.maindomain.com живет на другом сервере (на платформе hubspot)

1 Ответ

0 голосов
/ 30 октября 2018

Ваши текущие перенаправления не верны, поэтому они должны быть исправлены. (Хотя вы бы видели какой-то редирект.)

RewriteCond %{HTTP_HOST} ^oldsub\. [NC]
RewriteCond %{HTTP_HOST} ^(?:oldsub\.)?(.+)$ [NC]
RewriteRule ^ https://blog.%1%{REQUEST_URI} [L,NE,R=301]

RewriteCond %{HTTP_HOST} ^oldsub\.gppcpa\.com$ [NC]
RewriteRule ^ https://maindomain.com/specific-url-title/ [L,NE,R=301]

Проблемы с этими директивами:

  • Первое правило не перенаправляет в подкаталог /blog.

  • Эти правила противоречат друг другу. Первое правило также перенаправит корень документа субдомена. Следовательно, второе правило никогда не будет обработано.

Поскольку рассматриваемый поддомен находится полностью за пределами вашего основного домена, с точки зрения того, где эти имена хостов указывают в вашей файловой системе, нет необходимости проверять имя хоста в этих директивах, поскольку только поддомен oldsub может получить доступ к этой области. .

Попробуйте вместо этого:

RewriteRule . https://blog.maindomain.com/blog%{REQUEST_URI} [R=302,L]

RewriteRule ^ https://maindomain.com/specific-url-title/ [R=302,L]

Одиночная точка в первом шаблоне RewriteRule соответствует «чему-то» (а не «ничему»). Когда URL-путь пуст (т. Е. Корень документа), это переходит ко второй директиве.

Убедитесь, что вы очистили кеш браузера перед тестированием.

Тест с 302 (временными) перенаправлениями и только 301 (постоянный), если вы уверены, что он работает нормально. Это сделано для того, чтобы избежать каких-либо проблем с кэшированием, поскольку браузер постоянно кэширует 301 (включая ошибочные).


RewriteCond %{HTTP_HOST} 
RedirectMatch 301 ^/blog/(.*)$ https://blog.maindomain.com/blog/$1

Из вашего файла домена maindomain .htaccess ... Эта директива RewriteCond здесь ошибочна и должна быть удалена.

Чтобы избежать потенциальных конфликтов с mod_rewrite, вы должны изменить директиву mod_alias RedirectMatch на mod_rewrite. Например:

RewriteEngine On
RewriteRule ^blog/(.*) https://blog.maindomain.com/blog/$1 [R=302,L]

Различные модули Apache (mod_rewrite, mod_alias и т. Д.) Выполняются в разное время на протяжении всего запроса и работают независимо друг от друга. mod_rewrite обычно запускается первым (независимо от видимого порядка директив в вашем файле конфигурации), но это также означает, что mod_alias (Redirect, RedirectMatch) всегда будет работать, даже если более ранняя директива mod_rewrite (RewriteRule) могла бы переписал URL и остановил выполнение.

...