.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 тут. Я щойно тестував.
ВИ

Моє погано ... це працює, у мого сервісу хостингу було якесь інше переадресація, на яку було зроблено фу **** Дякую! :)
Юваль Адам

25
Чи не було б RewriteCond %{HTTP_HOST} !^NEWDOMAIN\.com$ [NC]?
Jim Geurts

1
Після довгої зими я відредагував код, щоб він нарешті міг працювати. (правильним є переспрямування, якщо РІВНЕ, а не РІЗНИМ для старогодомену, це була проблема)
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]

Це дозволить перенаправити на індекс за замовчуванням, про що йшлося у вашому питанні. Тільки для наочності, оскільки через близькість ваше висловлювання, схоже, спрямоване на відповідь user968421 трохи вище цього, відповідь user968421 є правильним, коли наміром є перенаправлення на відповідне ім’я файлу на новому домені.
RationalRabbit

19

Я використовував для свого блогу 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>

2
Я вважаю це найбільш вичерпною відповіддю з усіх: вона зберігає рейтинг кожної сторінки і є викликом для всіх доменів, які не є первинними! Що може бути краще?
nzn

1
Ключовим тут є те, що правило перезапису домену є перед правилом переписання індексу WordPress.
MrMoxy

14
<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

Якщо ви додасте 1 долар до першого прикладу, як цей, Redirect 301 / http://example.com/$1 тоді всі сторінки оригінального сайту будуть переспрямовані на новий корінь сайту
Yassine Mokni

@YassinMK Тут $1не потрібно, ви думаєте про RedirectMatchдирективу (але тоді вам все одно потрібно буде визначити групу захоплення для $1посилання).
MrWhite

Хоча всі ці Redirectдирективи будуть переадресовані на зразок подібного, тоді як ОП хоче переспрямувати лише на головну сторінку нового веб-сайту (хоча це саме по собі не рекомендується). Можливо, вам доведеться використовувати RedirectMatchдирективу, якщо ви хочете просто перенаправити певну URL-адресу.
MrWhite

замість 301 ви також можете написати Perirect permanent / h ttps: //www.example.com, це можна зробити у файлі vhost
Івон Хуйнх

Але питання, що стосується .htaccess, тож чому згадувати файл vhost?
RustyIngles

9

Якщо ви хочете переадресувати з певного місця на піддомен, ви можете скористатися:

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


Це найкращий спосіб. Оскільки багато 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якщо обидва ваших нового домену та olddomain на одному хості, у такому випадку вам потрібно буде використовувати mod-rewriteпереадресацію на основі запитуваного заголовка хоста.

RewriteEngine on


RewriteCond %{HTTP_HOST} ^(www\.)?olddomain\.com$
RewriteRule ^ http://newdomain.com%{REQUEST_URI} [NE,L,R] 

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, це засмучує.)


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

2

Якщо ви хочете переспрямувати новий веб-сайт (домен) без параметрів або сторінок, скористайтеся цим:

RewriteEngine On
RewriteRule / http://new-domain.com/$1? [R=301]

1
Це не буде працювати, як очікувалося, при використанні, .htaccessоскільки воно просто не збігатиметься з будь-якою URL-адресою в корені документа. Він буде працювати в конфігурації сервера або в контексті VirtualHost.
MrWhite

2

Я спробував відповідь user968421 та рішення ОП, але в браузері з’явилася помилка безпеки для сторінки оформлення замовлення. Не можу сказати, чому саме так.

Наш хост (Site Ground) також не міг цього зрозуміти.

Остаточне рішення було близьким, але незначна зміна відповіді user968421 (бічна примітка: на відміну від ОП, я намагався перенаправити на відповідну сторінку, а не лише на домашню сторінку, тому я підтримував зворотну посилання [ $1домен після домену] від user968421's відповідь):

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

Отримати налаштування від цього генератора переадресації htaccess, рекомендованого статтею про хоста Гатора (відчайдушні часи, відчайдушні заходи, айрійт?).


2

Просто так, як це, і це не буде переносити зворотний запит від URL-адреси до нового домену.

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteRule .* https://www.newdomain.com/? [R=301,L]

що насправді працювало для мене, потрібне рішення з передачею будь-якого слима на новий домен Спасибі 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 та переспрямує весь інший персонал на новий домен.


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]
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.