Перенаправить страницы со старого на новый сайт - по одной - PullRequest
0 голосов
/ 14 сентября 2009

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

стр. 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]
...

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

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

Ответы [ 4 ]

3 голосов
/ 14 сентября 2009

Директива 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]
1 голос
/ 19 сентября 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;
?>
0 голосов
/ 19 сентября 2009

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

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

Директива Redirect отображает старый URL в новый, попросив клиента переоснастить ресурс на новый место.

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

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

Так что это сделало бы это:

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

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

0 голосов
/ 14 сентября 2009

В httpd.conf:

RedirectPermananent URL1 URL2

...