Перенаправление страниц со старого на новый сайт - по одной

Я пытаюсь перенаправить страницы с нескольких старых доменов на один новый домен постранично, то есть:

страница 1: http://www.example.org/default.asp?id=1 перенаправляет на страницу http://www.example2.org/newpage.html. 2: http://www.example2.org/default.asp?id=2 перенаправляет на http://www.example.org/contact.html

...и так далее. Каждая старая страница будет перенаправлять на определенную новую страницу.

Я попытался написать что-то в .htaccess по строкам

Redirect 301 http://www.example.org/default.asp?id=1 h-tp://www.example.org/newpage.html
Redirect 301 http://www.example2.org/default.asp?id=2 h-tp://www.example.org/contact.html

Но пока не повезло. mod_alias включен...

Я также пытался использовать RewriteCond и RewriteRule следующим образом:

RewriteCond %{HTTP_HOST} example.org
RewriteRule default.asp?id=1 http://www.example.org/newpage.html [NC,L,R=301]
...

Другими словами: я хочу сделать постраничную переадресацию с идентификатора на псевдоним вместе с объединением трех сайтов/доменов в один сайт.

Я надеюсь, что есть полезное решение. Заранее спасибо!


person Ulrik H. Kold    schedule 14.09.2009    source источник


Ответы (4)


Директива Redirect работает только с URL-путь, но не хост или запрос URL-адреса.

Но это возможно с mod_rewrite:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} =id=1
RewriteRule ^default\.asp$ http://www.example.org/newpage.html [NC,L,R=301]

И, как уже было сказано в комментариях, вы можете использовать карту перезаписи для сопоставления идентификатора с псевдонимом:

1 foo-page
2 bar-page
3 baz-page
…

Объявление RewriteMap (здесь простой текстовый файл):

RewriteMap id-to-alias txt:/absolute/file/system/path/to/id-to-alias.txt

И, наконец, приложение:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3}&%1%4 ^([^&]+)&(.*)
RewriteRule ^default\.asp$ http://www.example.org/%1.html?%2 [NC,L,R=301]

Это также должно сохранить оставшийся запрос. Если вы этого не хотите:

RewriteCond %{HTTP_HOST} =example.org
RewriteCond %{QUERY_STRING} ^(([^&]*&)*)id=([0-9]+)&?([^&].*)?$
RewriteCond ${id-to-alias:%3} .+
RewriteRule ^default\.asp$ http://www.example.org/%0.html? [NC,L,R=301]
person Gumbo    schedule 14.09.2009
comment
Так что в основном мне нужно две строки на странице? Один с RewriteCond, соответствующим идентификатору, а другой с RewriteRule, чтобы убедиться, что пользователь отправлен на нужную страницу? И закончить с [L]? Я наконец на правильном пути? - person Ulrik H. Kold; 14.09.2009
comment
В общем, да. Но вы можете использовать карту перезаписи для хранения сопоставления идентификатора с псевдонимом (см. http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap). - person Gumbo; 14.09.2009
comment
И для помощи другим: объявление RewriteMap может быть только в httpd.conf — не утруждайте себя помещением его в .htaccess, как я только что сделал. - person Ulrik H. Kold; 15.09.2009

Хорошая альтернатива mod_rewrite — использовать любой язык, который вам наиболее удобен, и поместить логику в свой сценарий. Направьте все URL-адреса, которые вы хотите перенаправить, на ваш простой фронт-контроллер.

RewriteRule ^default.asp$ /redirect.php [L]
RewriteRule ^another/path/to_some_file.ext$ /redirect.php [L]

А затем в redirect.php:

<?php
if ($_SERVER['SCRIPT_URL'] == '/default.asp'){
    $map = array(
        1 => '/newpage.html',
        2 => '/contact.html'
    );
    if (isset($_GET['id'])){
        $id = $_GET['id'];
        if (isset($map[$id])){
            header('HTTP/1.1 301 Moved Permanently', true, 301);
            header('Location: http://'.$_SERVER['HTTP_HOST'].$map[$id]);
            exit;
        }
    }
}
// ... handle another/path/to_some_file.ext here, or other domains, or whatever ...

// If we get here, it's an invalid URL
header('HTTP/1.1 404 Not Found', true, 404);
echo '<h1>HTTP/1.1 404 Not Found</h1>';
echo '<p>The page you requested could not be found.</p>';
exit;
?>
person Patrick Fisher    schedule 19.09.2009

Просто добавлю немного информации

Директивы перенаправления OP, вероятно, имеют неправильный формат - из соответствующего документа apache страница:

Директива Redirect сопоставляет старый URL-адрес с новым, запрашивая у клиента повторную загрузку ресурса в новом месте.

Старый URL-путь — это путь с учетом регистра (%-decoded), начинающийся с косой черты. Относительный путь не допускается. Новый URL-адрес должен быть абсолютным URL-адресом, начинающимся со схемы и имени хоста. Пример:

Redirect /service http://foo2.bar.com/service

Так что это будет:

Redirect 301 /default.asp?id=1 http://www.example.org/newpage.html

надеюсь, это поможет

person J.C. Inacio    schedule 19.09.2009
comment
Но, как указано в цитируемом фрагменте, Redirect работает только с URL-адресом и принимает данный URL-адрес в качестве префикса, который должен быть сопоставлен. - person Gumbo; 19.09.2009

В httpd.conf:

ПеренаправлениеПостоянный URL1 URL2

person randomx    schedule 14.09.2009
comment
К сожалению, этот метод неприменим, так как у меня нет доступа к httpd.conf. - person Ulrik H. Kold; 14.09.2009
comment
Но все примеры, которые я нашел с перенаправлением, работают только на одном хосте. - person Ulrik H. Kold; 14.09.2009