Массовый редирект 301 из htaccess - PullRequest
1 голос
/ 16 ноября 2011

У меня есть электронная таблица, в которой есть столбец с ошибкой 404 и соответствующие перенаправления 301.например,

404 error page                    301 redirect      

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

В таблице содержится около 1000+ ссылок.

Есть ли какой-либо способ в конфигурации Apache или htaccess, где я могу обрабатывать массовые перенаправления 301?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2011

Лучший способ настройки Bulk - это директива RewriteMap в mod-rewrite. Обратите внимание, что это не будет работать в файле .htaccess. Вам нужно будет отредактировать его в реальном файле конфигурации Apache (и хорошая новость заключается в том, что он будет действительно быстрее динамической конфигурации .htaccess).

Сначала проверьте ключевое слово txt:.

Может быть что-то вроде этого:

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

Когда все заработает хорошо, преобразуйте 302 в 301 и преобразуйте текстовый файл в более быстрый хэш-файл с ключевым словом dbm: (и командой httxt2dbm, но это объясняется в связанном документе).

0 голосов
/ 04 июня 2014

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 = Источник URL

durl = URL назначения

0 голосов
/ 22 июня 2013

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 файла карты не изменится или сервер не выполнит перезапускать.

...