批量301从htaccess重定向

时间:2011-11-16 06:02:04

标签: apache .htaccess vhosts

我的电子表格包含404错误链接列及其各自的301重定向。 例如)

404 error page                    301 redirect      

http://www.abc.com/1.php          http://www.abc/com/2.php
..............                    ............

电子表格有大约1000多个链接。

在apache配置或htaccess中有什么办法可以处理批量301重定向吗?

3 个答案:

答案 0 :(得分:2)

批量设置的最佳方法是mod-rewrite中的RewriteMap指令。请注意,这不适用于.htaccess文件。你需要在一个真正的apache配置文件中编辑它(好消息是它会比.htaccess动态配置更快)。

首先检查txt:关键字。

可能是这样的:

RewriteMap myredirects txt:/path/to/my/txt/map.txt 
RewriteCond ${myredirects:$1} ^/.+
RewriteRule ^(.+)$ %0 [R=302]

如果你能够很好地转换301中的302,并使用dbm:关键字(以及httxt2dbm命令将txt文件转换为更快的hashmap,但是在链接中对此进行了解释DOC)。

答案 1 :(得分:0)

RewriteMap确实是regilero所说的方式。但是,我无法理解他的代码是如何工作的,我也不能让它工作。一个问题是它假设没有进一步的重写(缺少[L])这确实有效:

在apache配置中(在.htaccess中不起作用):

RewriteMap myredirects txt:/var/www/mysite/redirects.txt

在.htaccess中(也适用于apache配置):

RewriteCond ${myredirects:%{REQUEST_URI}} .+
RewriteRule ^ ${myredirects:%{REQUEST_URI}} [L,R=301]

在redirects.txt中(注意:斜杠不是可选的)

/old /new

我不确定切换到dbm值得额外的麻烦。 正如http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap所述,无论如何,查询都会缓存在内存中。

  

对于纯文本和DBM格式文件,查找的密钥将被缓存   in-core直到mapfile的mtime改变或服务器执行   重新启动。

答案 2 :(得分:0)

在404.php中include_once这个文件 - 确保404.php被配置为在有404时被调用:

//ini_set('display_errors',2);
//ini_set('log_errors',0);
//ini_set('error_reporting',E_ALL);
$username = "dbuser";
$password = "dbpasswd";
$hostname = "db.hostname.com"; 
$database = "dbname";
$table    = "tablename";
$curl   = "http://". $_SERVER['HTTP_HOST'];

$dbhandle = mysql_connect($hostname, $username, $password) 
  or die("Unable to connect to MySQL". mysql_error());
mysql_select_db($database) or die('Could not select database' . $database );

$query = 'SELECT durl FROM urls where surl="' . $curl . '";';
$result = mysql_query($query) or die('Query failed: ' . mysql_error());

$durl = mysql_fetch_array($result);
if(isset ($durl) && $durl !=""){
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location:". $durl);
}
//else{
//  echo "404 Not Found ";
//}
// Free resultset
mysql_free_result($result);

// Closing connection
mysql_close($dbhandle);
?>

表格结构:

CREATE TABLE tablename (surl varchar(256),
durl varchar(256));

surl =来源网址

durl =目的地网址