我正在尝试在一个页面到页面的基础上从一个新域重定向来自几个旧域的页面,即:

第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到基于别名,以及将三个站点/域合并到一个站点中。

我希望有一个有用的解决方案。提前谢谢!

有帮助吗?

解决方案

Redirect 指令仅适用于网址路径,但不适用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]

正如评论中已经说过的那样,您可以使用重写地图用于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]

其他提示

mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。

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

然后,在redirect.php中:

<?php
if (

mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。

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

然后,在redirect.php中:

<*>SERVER['SCRIPT_URL'] == '/default.asp'){ $map = array( 1 => '/newpage.html', 2 => '/contact.html' ); if (isset(

mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。

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

然后,在redirect.php中:

<*>GET['id'])){ $id =

mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。

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

然后,在redirect.php中:

<*>GET['id']; if (isset($map[$id])){ header('HTTP/1.1 301 Moved Permanently', true, 301); header('Location: http://'.

mod_rewrite的一个很好的替代方法是使用您最熟悉的语言并将逻辑放在脚本中。将您想要重定向的所有网址指向简单的前端控制器。

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

然后,在redirect.php中:

<*>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; ?>

只需添加更多信息

OP的重定向指令可能格式错误 - 来自相关的apache doc

  

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

希望有所帮助

在httpd.conf中:

RedirectPermananent URL1 URL2

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top