loading...

Авторизация ...

Имя пользователя :
Пароль :
я всё забыл!

Хаки301-й редирект с ЧПУ 3-го типа на ЧПУ 2-го типа

Написал Mr.Smith, 11 декабря 2010 | 15 комментариев | рейтинг новости не нравится   +4   нравится Версия для печати
Здравствуйте,
недавно просматривал новость http://4dle.ru/hacks/1147159054-301-redirekt-na-pravilnye-kategorii.html и вспомнил, что когда-то в "Инструменты для веб-мастера" от Google в разделе "Предложения HTML" для одного из моих сайтов было указано около тысячи страниц, которые доступны по третьему и второму типу ЧПУ, хотя на сайте давно уже используется второй. По сути, это дублирование контента, поэтому вдохновленный указанной новостью решил попробовать свои силы в самостоятельном написании хака для лечения этой проблемы 301-м редиректом с помощью PHP.

/*
=====================================================
Установка хака
=====================================================
*/

1. Открыть файл /index.php

Найти:
require_once ROOT_DIR . '/engine/init.php';


Ниже добавить:
if (preg_match ('#([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*).html#si', $_SERVER['REQUEST_URI'], $matches)) {
    $row = $db->super_query ("SELECT " . PREFIX . "_category.alt_name as category, " . PREFIX . "_post.id, " . PREFIX . "_post.alt_name FROM " . PREFIX . "_category, " . PREFIX . "_post WHERE " . PREFIX . "_category.id = " . PREFIX . "_post.category AND " . PREFIX . "_post.date BETWEEN '{$matches[1]}-{$matches[2]}-{$matches[3]} 00:00:01' AND '{$matches[1]}-{$matches[2]}-{$matches[3]} 23:59:59' AND " . PREFIX . "_post.alt_name = '{$matches[4]}'");
    $category = $row['category'];
    $id = $row['id'];
    $alt_name = $row['alt_name'];
    $full_link = $config['http_home_url'] . $category . '/' . $id . '-' . $alt_name . '.html';
    header ($_SERVER['SERVER_PROTOCOL'] . '301 Moved Permanently');
    header ('Location: ' . $full_link);
}


Готово!

P.S. Конструктивная критика приветствуется!

Отблагодарили: lika004

Комментарии пользователей

  Экспорт комментариев в RSS
 Сортировать по рейтингу, по дате

Написал MbyteZ, 11 декабря 2010 в 16:52 плохой комментарий   0   хороший комментарий
Новостей: 2, комментариев: 26, Пользователи
Карма:
Подскажите как с 1-го на 2-й перейти smile

Написал Mr.Smith, 11 декабря 2010 в 16:57 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
Попробуй так:

if (preg_match ('#([0-9]{1,})-(.*).html#si', $_SERVER['REQUEST_URI'], $matches)) {
    $row = $db->super_query ("SELECT " . PREFIX . "_post.id, " . PREFIX . "_post.alt_name, " . PREFIX . "_post.category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.id = '{$matches[1]}'");
    $category = $row['category'];
    $id = $row['id'];
    $alt_name = $row['alt_name'];
    $full_link = $config['http_home_url'] . $category . '/' . $id . '-' . $alt_name . '.html';
    header ($_SERVER['SERVER_PROTOCOL'] . '301 Moved Permanently');
    header ('Location: ' . $full_link);
}

Написал Yeti, 11 декабря 2010 в 19:31 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 60, Пользователи
Карма:
При таком раскладе получите что сервер перенаправляет запрос на этот адрес таким образом, что он никогда не завершится mellow

Написал Mr.Smith, 11 декабря 2010 в 20:36 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
Допиши в конце:

die ();

Написал Yeti, 11 декабря 2010 в 22:34 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 60, Пользователи
Карма:
не поможет, там и с категориёй косяк получится - её id в url-е

Написал Mr.Smith, 11 декабря 2010 в 22:56 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
В каком урле?

Написал Yeti, 11 декабря 2010 в 22:58 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 60, Пользователи
Карма:
так вы возмите и проверьте, то что людям советуете

Написал Mr.Smith, 11 декабря 2010 в 23:02 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
// 1->2
if (preg_match ('#([0-9]{1,})-(.*).html#si', $_SERVER['REQUEST_URI'], $matches)) {
    $row = $db->super_query ("SELECT " . PREFIX . "_post.id, " . PREFIX . "_post.alt_name, " . PREFIX . "_post.category FROM " . PREFIX . "_post WHERE " . PREFIX . "_post.id = '{$matches[1]}'");
    $row['category'] = preg_match ('#(\d+),(\d+)#si', $row['category'], $matches) ? $matches[1] : $row['category'];
    $full_link = $config['http_home_url'] . get_url ($row['category']) . '/' . $row['id'] . '-' . $row['alt_name'] . '.html';
    header ($_SERVER['SERVER_PROTOCOL'] . '301 Moved Permanently');
    header ('Location: ' . $full_link);
    die ();
}

Написал Брупт, вчера, 15:05 плохой комментарий   0   хороший комментарий
Новостей: 4, комментариев: 83, Пользователи
Карма:
Из-за
if (preg_match ('#([0-9]{1,})-(.*).html#si', $_SERVER['REQUEST_URI'], $matches)) {


будет постоянный редирект )

Написал Mr.Smith, вчера, 15:20 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
Я уже понял smile, сделал без preg_match для 3->2, если будет время поиграться, сделаю универсальный для всех случаев smile

Написал Bomberman, 11 декабря 2010 в 19:07 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 146, Пользователи
Карма:
С preg_match'ем каждый сможет сделать. А вот вы сделайте без регулярок вообще.
Представьте если в каждом хаке будет по одному preg_match, который впридачу будет срабатывать каждый раз при открытии какой-либо страницы.

Написал Mr.Smith, 11 декабря 2010 в 19:09 плохой комментарий   +1   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
Можно и без preg_match сделать smile:
    $news_name = substr ($news_name, 0, strlen ($news_id)) != $news_id ? $news_name : substr ($news_name, strlen ($news_id) + 1);
    $full_link = $config['http_home_url'] . get_url ($category_id) . '/' . $news_id . '-' . $news_name . '.html';
    if ($full_link != $config['http_home_url'] . substr ($_SERVER['REQUEST_URI'], 1)) {
        header ($_SERVER['SERVER_PROTOCOL'] . '301 Moved Permanently');
        header ('Location: ' . $full_link);
        die ();
    }

Вставить после строки:
if ($dle_module == "showfull" ) {

Написал Yeti, вчера, 17:46 плохой комментарий   0   хороший комментарий
Новостей: 0, комментариев: 60, Пользователи
Карма:
Mr.Smith трудно было до вас достучатся, но Брупт помог.
Всех с наступающим и в репу заслужившим!

Написал Брупт, вчера, 15:32 плохой комментарий   0   хороший комментарий
Новостей: 4, комментариев: 83, Пользователи
Карма:
Для 1->2 можно как то так сделать:
if ( $newsid > 0 AND ! preg_match ( '#([^.]+)/([0-9]{1,11})-(.*).html#si', $_SERVER['REQUEST_URI'] ) )
{
$row = $db->super_query ("select id, alt_name, category from " . PREFIX . "_post where id = '{$newsid}'");

$row['category'] = intval( $row['category'] );

if ( $row['category'] > 0 )
{
$full_link = $config['http_home_url'] . get_url ( $row['category'] ) . '/' . $row['id'] . '-' . $row['alt_name'] . '.html';

header ( $_SERVER['SERVER_PROTOCOL'] . ' 301 Moved Permanently' );
header ( 'Location: ' . $full_link );
}
}

Написал Mr.Smith, вчера, 15:53 плохой комментарий   0   хороший комментарий
Новостей: 1, комментариев: 31, Пользователи
Карма:
3->2. Вариант 301-го редиректа для новостей от указанной даты (в примере указана дата выхода DataLife Engine 6.5):
    $date = $year . '-' . $month . '-' . $day;
    $news_name = substr ($news_name, 0, strlen ($news_id)) != $news_id ? $news_name : substr ($news_name, strlen ($news_id) + 1);
    $full_link = $config['http_home_url'] . get_url ($category_id) . '/' . $news_id . '-' . $news_name . '.html';
    if ($date > '2007-12-11' and
        $full_link != $config['http_home_url'] . substr ($_SERVER['REQUEST_URI'], 1)) {
        header ($_SERVER['SERVER_PROTOCOL'] . '301 Moved Permanently');
        header ('Location: ' . $full_link);
        die ();
    }

Информация



Посетители, находящиеся в группе Гости, не могут оставлять комментарии в данной новости.
Rambler's Top100

[removed][removed] [removed] (adsbygoogle = window.adsbygoogle || []).push({}); [removed]