我的电子表格包含404错误链接列及其各自的301重定向。 例如)
404 error page 301 redirect
http://www.abc.com/1.php http://www.abc/com/2.php
.............. ............
电子表格有大约1000多个链接。
在apache配置或htaccess中有什么办法可以处理批量301重定向吗?
答案 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 =目的地网址