2009-09-14 4 views
0

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

страница 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] 
... 

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

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

ответ

3

директива Redirect работает только с URL path но не хоста или запроса из 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] 

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

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] 
+0

Так что в принципе мне понадобится две строки на страницу? Один с RewriteCond, соответствующий идентификатору, и один с RewriteRule, который обязательно отправит пользователя на нужную страницу? И заключить с помощью [L]? Я, наконец, на правильном пути? –

+0

В общем, да. Но вы можете использовать карту перезаписи для хранения сопоставления ID-to-alias (см. Http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap). – Gumbo

+0

И для помощи других: объявление RewriteMap может только перейти в httpd.conf - не мешайте помещать его в .htaccess, как я это делал сейчас. –

-1

В httpd.conf:

RedirectPermananent URL1 URL2

+0

К сожалению, этот метод не может использоваться, как у меня нет доступа к httpd.conf –

+0

Но все примеры, которые я нашел с помощью Redirect, работают только с одним хостом. –

1

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

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

И затем в переадресации.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

Просто добавить еще некоторую информацию

директивы перенаправлять OP являются, вероятно, в неправильном формате - от соответствующего апача документ 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

Но, как указано в выписанных состояниях экстента, «Редирект» работает только по пути URL-адреса и принимает заданный URL-адрес в качестве префикса, который должен быть сопоставлен. – Gumbo