1

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

404 error page                    301 redirect      

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

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

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

4

3 回答 3

2

批量设置的最佳方式是 mod-rewrite 中的RewriteMap指令。请注意,这在 .htaccess 文件中不起作用。您需要在真正的 apache 配置文件中对其进行编辑(好消息是这将比 .htaccess 动态配置真正快)。

首先检查txt:关键字。

可能是这样的:

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

当你让它运行良好时,将 302 转换为 301,并使用dbm:关键字(和一个httxt2dbm命令,但在链接的文档中对此进行了解释)将 txt 文件转换为更快的哈希图。

于 2011-11-16T19:29:32.513 回答
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 格式文件,查找的键被缓存在内核中,直到映射文件的 mtime 更改或服务器重新启动。

于 2013-06-22T15:38:58.940 回答
0

include_once 这个文件在 404.php - 确保 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 = 目标网址

于 2014-06-04T12:36:36.890 回答