我正在尝试在一个页面到页面的基础上从一个新域重定向来自几个旧域的页面,即:
第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]
...
换句话说:我希望逐页重定向,从基于ID到基于别名,以及将三个站点/域合并到一个站点中。
我希望有一个有用的解决方案。提前谢谢!
答案 0 :(得分:3)
Redirect
指令仅适用于URL path,但不适用于网址的主机或查询。
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-to-alias映射:
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 :(得分:1)
mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。
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;
?>
答案 2 :(得分:0)
只需添加更多信息
OP的重定向指令可能格式错误 - 来自相关的apache doc page:
Redirect指令映射旧URL 通过询问客户进入新的 在新的地方重新获取资源 位置。
旧的URL路径区分大小写 (%-decoded)路径以a开头 斜线即可。相对路径不是 允许。新网址应该是 以方案开头的绝对URL 和主机名。例如:
Redirect /service http://foo2.bar.com/service
这样就可以了:
Redirect 301 /default.asp?id=1 http://www.example.org/newpage.html
希望有所帮助
答案 3 :(得分:-1)
在httpd.conf中:
RedirectPermananent URL1 URL2