.htaccess перенаправить все страницы на новый домен

218

Какое правило перенаправления я буду использовать для перенаправления всех страниц, olddomain.exampleна которые нужно перенаправить newdomain.example?

Сайт имеет совершенно другую структуру, поэтому я хочу, чтобы каждая страница в старом домене была перенаправлена ​​на новую индексную страницу домена .

Я думал, что это будет делать (в базовой директории olddomain.example):

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.example/ [R=301]

Но если я перейду к, olddomain.example/somepageменя перенаправят на newdomain.example/somepage. Я ожидаю перенаправления только newdomain.exampleбез суффикса страницы.

Как мне сохранить последнюю часть?

Ювал Адам
источник
8
Чтобы сэкономить время, прокрутите вниз до правильного лучшего ответа: RewriteEngine on RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]* stackoverflow.com/a/7578810/1066234
Кай Ноак,
2
Стоит отметить, что, в частности, с точки зрения SEO, перенаправление «много-к-одному» на главную / индексную страницу, как правило, является плохой идеей. Google, скорее всего, воспримет это как софт-404.
MrWhite

Ответы:

201

Может быть так:

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^OLDDOMAIN\.com$ [NC]
RewriteRule ^(.*)$ http://NEWDOMAIN.com [R=301,L]
ТЫ
источник
Хм, не могли бы вы попробовать перезагрузить браузер? его даже перенаправление с xampp здесь. Я только что проверил.
ВЫ
Мой плохой ... он работает, у моей хостинговой службы был какой-то другой редирект, на котором все было в порядке. Спасибо! :)
Ювал Адам
26
Не будет ли это RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Джим Гёртс
1
После долгой зимы я отредактировал код, чтобы он наконец заработал. (правильно перенаправить, если EQUAL, а не DIFFERENT на olddomain, это проблема!)
carla
5
@JimGeurts Только если вы хотите перенаправить ВСЕ, что не является новым доменом. Однако в этом случае мы хотели перенаправить ТОЛЬКО старый домен.
Carla
442

Ответ ниже может потенциально вызвать бесконечный цикл перенаправления ...

Здесь этот перенаправляет все после имени домена в URL-адресе в ту же самую копию в новом URL-адресе домена:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]

www.example.net/somepage.html?var=foo перенаправляет на www.newdomain.com/somepage.html?var=foo

Крис Стрычински
источник
21
не будет ли это перенаправлять КАЖДЫЙ запрос, даже для newdomain.com? И, по сути, вызвать два повторных запроса в этих случаях?
Билл Дами
33
Вопрос в том, чтобы перенаправить все на домашнюю страницу
kravits88
28
Хотя это не ответ на вопрос, но я пришел к этому вопросу от SE, ища именно этот ответ. Спасибо !!!
Дав
Как мы можем сделать для перенаправления с субдомена на новый домен?
Сукхиндер Сингх
2
Может кто-нибудь ответить на вопрос Билла, пожалуйста. Разве это не должно использовать RewriteCond для предотвращения дублирования запроса и / или ненужных перезаписей? Я полагаю, это не окажет заметного влияния на переписывание каждый раз, даже если в этом нет необходимости. Но зачем это делать.
Андрей
80

Просто чтобы уточнить, после удаления перенаправления хостинга, который был в пути, мое оригинальное решение также работает:

RewriteEngine On
RewriteRule ^(.*)$ http://newdomain.com/ [R=301]
Ювал Адам
источник
Это перенаправит на индекс по умолчанию, о котором был ваш вопрос. Просто для ясности, поскольку из-за близости ваше утверждение, по-видимому, направлено на ответ пользователя 968421 чуть выше этого, ответ пользователя 968421 является правильным, если целью является перенаправление на соответствующее имя файла в новом домене.
RationalRabbit
20

Я использовал для своего блога Wordpress это как .htaccess. Он преобразует http: //www.blah.example/asad , http: //blah.example/asad , http: //www.blah.example2/asad и т. Д. В http: //blah.example/asad. Спасибо всем другие ответы я понял это.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} !^YOURDOMAIN\.example$ [NC]
RewriteRule ^(.*)$ https://YOURDOMAIN.example/$1 [R=301,L]

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
Daantje
источник
2
Я считаю, что это самый полный ответ из всех: он сохраняет рейтинг для каждой страницы и является ловушкой для всех доменов, которые не являются первичными! Что может быть лучше?
NZN
1
Ключевым моментом здесь является то, что правило перезаписи домена предшествует правилу перезаписи индекса WordPress.
MrMoxy
15
<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^olddomain.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.olddomain.com$
  RewriteRule (.*)$ http://www.newdomain.com/$1 [R=301,L]
</IfModule>

Это сработало для меня

Яна Сергиева
источник
Да, этот метод был бы чистым и красивым!, Работал и для меня.
Коди
он будет перенаправлен с параметром в URl, если он есть - index.php? aa = 9 перенесет параметр в новый домен
Darksymphony
13

Существуют различные способы сделать это и различные перенаправления, я перечислил их ниже:

301 (постоянное перенаправление): перенаправьте весь сайт на другой URL-адрес на постоянной основе. Это наиболее распространенный тип перенаправления, который полезен в большинстве ситуаций. В этом примере мы перенаправляем на домен «example.com»:

# This allows you to redirect your entire website to any other domain
Redirect 301 / http://example.com/

302 (Временное) Перенаправление: укажите весь сайт на другой временный URL. Это полезно в целях SEO, когда у вас есть временная целевая страница и вы планируете позже вернуться на свою главную целевую страницу:

# This allows you to redirect your entire website to any other domain
Redirect 302 / http://example.com/

Перенаправьте index.html в определенную подпапку:

# This allows you to redirect index.html to a specific subfolder
Redirect /index.html http://example.com/newdirectory/

Перенаправить старый файл на новый путь к файлу:

# Redirect old file path to new file path
Redirect /olddirectory/oldfile.html http://example.com/newdirectory/newfile.html

Перенаправить на определенную страницу индекса:

# Provide Specific Index Page (Set the default handler)
DirectoryIndex index.html
RustyIngles
источник
Если вы добавите $ 1 к первому примеру, как это, Redirect 301 / http://example.com/$1 тогда все страницы исходного сайта будут перенаправлены в новый корень сайта
Yassine Mokni
@YassinMK Здесь $1не требуется, вы думаете о RedirectMatchдирективе (но тогда вам все равно нужно определить группу захвата для $1ссылки).
MrWhite
Хотя все эти Redirectдирективы будут перенаправляться как лайк, тогда как ОП хочет перенаправить только на домашнюю страницу нового сайта (хотя это само по себе не рекомендуется). Возможно, вам придется использовать RedirectMatchдирективу, если вы хотите просто перенаправить на определенный URL.
MrWhite
вместо 301 вы могли бы также написать перманент перенаправления / h ttps: //www.example.com, вы можете сделать это в файле
Ивон
Но вопрос, связанный с .htaccess, так зачем упоминать файл vhost?
RustyIngles
9

Если вы хотите перенаправить из какого-либо места на поддомен, вы можете использовать:

Redirect 301 /Old-Location/ http://subdomain.yourdomain.com

EmptySD
источник
Это лучший способ. Потому что многие Webhosters не позволяли использовать RewriteEngine в .htaccess. Это прекрасно работает в любом случае!
Sprinterfreak
Вы должны использовать RewriteEngine для перенаправления. Причина, по которой у вас возникла проблема, заключается в том, что RewriteEngine уже был активен, и вам нужно было только правило перенаправления. Я рад, что это помогло.
EmptySD
Не правда. Он пропускает все вещи перезаписи и при использовании RewriteEngine Onбросает 500 внутренних ошибок. Это очень ограниченное веб-пространство. Использование Redirect 301 / http://foo- единственный возможный способ иметь дело.
Sprinterfreak
6

Если новый домен, на который вы перенаправляете свой старый сайт, находится на другом хосте, вы можете просто использовать Redirect

Redirect 301 / http://newdomain.com

Это будет перенаправлять все запросы от olddomainк newdomain.

RedirectДиректива не будет работать или может вызвать, Redirect loopесли ваш новый домен и старый домен оба находятся на одном хосте, в этом случае вам нужно будет использовать mod-rewriteперенаправление на основе запрошенного заголовка хоста.

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 
starkeen
источник
5

Моя репутация не позволяет мне комментировать ответ, но я просто хотел отметить, что здесь ответ с самым высоким рейтингом имеет ошибку:

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com$1 [R=301,L]

должен иметь косую черту до 1 доллара, так

RewriteEngine on 
RewriteRule ^(.*)$ http://www.newdomain.com/$1 [R=301,L]
Джон Бранденбург
источник
3

Мое решение как SymLinks не работало на моем сервере, поэтому я использовал If в своем PHP.

function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
        $pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"] . $_SERVER["REQUEST_URI"];
    } else {
        $pageURL .= $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"];
    }
    return $pageURL;
}
$redirect = str_replace("www.", "", curPageURL());
$remove_http_root    = str_replace('http://', '', $redirect);
$split_url_array     = explode('/', $remove_http_root );


if($split_url_array[0] == "olddomain.com"){
    header("Location: http://www.newdomain.com/$split_url_array[1]");
    die();
}
казарка
источник
2

Это ошибка в старых версиях apache (и, следовательно, mod_rewrite), где префикс пути был добавлен к переписанному пути, если он был изменен. Посмотреть здесь

Я думаю, что это было исправлено в apache2 V2.2.12, вам нужно использовать специальный флаг, который я добавлю сюда, когда найду его (я думаю, что это был NP для No Path)

RewriteRule ^(.*)$ http://newdomain.com/ [??]
Вопросительный знак
источник
Я ударился головой об это почти месяц
Вопросительный знак
2

С точки зрения удобства использования было бы лучше, если бы вы также отправили путь с запросом (т. Е. То, что у вас есть в данный момент) и позволили вашему новому сайту разобраться с этим:

Вы искали "/ продукты".

К сожалению, эта страница исчезла. Хотите вместо этого посетить "/ new_products"?

(и еще лучше, делая это автоматически.)

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

Boldewyn
источник
Для указанного сайта это в значительной степени не имеет значения, поскольку весь сайт изменился, но вы абсолютно правы. Веб-сайт должен быть как можно более обратно совместимым. +1
Ювал Адам
2

Если вы хотите перенаправить, чтобы завершить новый сайт (домен) без параметров или страниц, используйте это:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]
MCurbelo
источник
1
Это не будет работать должным образом при использовании в, так .htaccessкак оно просто не будет соответствовать ни одному URL в корне документа. Это будет работать в конфигурации сервера или в контексте VirtualHost.
MrWhite
2

Я попробовал ответ user968421 и решение OP, но браузер выдал ошибку безопасности для страницы оформления заказа. Я не могу сказать вам, почему именно.

Наш хост (Site Ground) тоже не мог этого понять.

Окончательное решение было близким, но с небольшой поправкой к ответу user968421 (примечание: в отличие от OP, я пытался перенаправить на соответствующую страницу, а не только на домашнюю страницу, поэтому я сохранил обратную ссылку [ $1после домена] от user968421's ответ):

RewriteEngine on
RewriteRule (.*) https://newdomain.com/$1 [R=301,L]

Получил настройки от этого генератора перенаправления htaccess, рекомендованного статьей Host Gator (отчаянные времена, отчаянные меры, amiright?).

J мая
источник
2

Просто так, и это не перенесет конечный запрос с URL на новый домен.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]
Darksymphony
источник
это на самом деле сработало для меня, нужно решение без передачи любого домена в новый домен. Спасибо Dsynmphony
Faisal
1

Используйте условные перенаправления с помощью Options -FollowSymLinksи AllowOverride -Optionsотключенные хостером, если нужно также обслуживать несколько локальных файлов:

Образец .htaccess

# Redirect everything except index.html to http://foo
<FilesMatch "(?<!index\.html)$">
    Redirect 301 / http://foo/
</FilesMatch>

Этот пример будет обслуживать локальный index.html и перенаправлять всех остальных сотрудников на новый домен.

Sprinterfreak
источник
1

Попробуйте этот метод, чтобы перенаправить все на домашнюю страницу нового домена, у меня это работает:

RewriteCond %{HTTP_HOST} ^olddomain\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.olddomain\.com$
RewriteRule ^(.*)$ "https\:\/\/newdomain\.com\/" [R=301,L]
Ханс Гантенг
источник
0

Предыдущие ответы не работали для меня.

Я использовал этот код. Если вы используете OSX, убедитесь, что вы используете правильный формат.

Options +FollowSymLinks -MultiViews
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.)?OLDDOMAIN\.com$ [NC]
RewriteRule (.*) http://www.NEWDOMAIN.com/ [R=301,L]
Alfrex92
источник