Реализиране на статични адреси с mod_rewrite модула на Apache

Напоследък е много модерно динамичното съдържание на сайта да се представя чрез псевдо-статични адреси. Става въпрос за това да няма адрес, който да изглежда по следния начин: http://mysite.com/news.php?id=1. Това си има определена цел и тя е по-доброто индексиране от търсещите машини. Те не се справят много добре с много променливи в адреса, даже имаше слух, че google  не индексира страници с id=xx в URL-a. Ето как лесно може да постигнете този ефект чрез mod_rewrite модула на Apache.

Първо - да проектираме схемата на сайта си


За този пример ще използваме сайт със следната структура - главен файл index.php, форум с адрес /forum, и динамично реализирани новини във файл news.php. Така .htaccess файла има следния вид:

RewriteEngine on
RewriteBase /code/mod_rewrite/

RewriteCond %{REQUEST_URI} !^\/forum
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css)$
RewriteRule news\/([0-9]*) news-file.php?id=$1 [L]

Първия ред указва на сървъра че ще се използва mod_rewrite. На втория ред пишем абсолютния адрес на сайта си в дървото на уеб-сървъра (ако имате собствен домейн или сайта ви е в най-горното ниво на сървъра укажете RewriteBase /). На третия ред указваме да не се преобразуват адресите, които започват с /forum, за да може да си функционира правилно форума. На следващия ред изключваме и различните ресурси като картинки, стилове и прочие. На ред 5 вече е преобразуващото правило. То преобразува всички адреси от типа /news/23 в /news-file.php?id=23.

По нататък въвеждаме още ограничения:

RewriteCond %{REQUEST_URI} !^\/code\/mod_rewrite\/forum
RewriteCond %{REQUEST_URI} !^\/code\/mod_rewrite\/news
RewriteCond %{REQUEST_URI} !\.(js|ico|gif|jpg|png|css)$
RewriteRule !^\/code\/mod_rewrite\/index index.php [L]

По този начин няма да са достъпни никакви адреси, освен /index.php, /news и /forum.

Второ - да оптимизираме линковете си


Много важен факт за това каква част от сайта ще попадне в кеша на google са линковете. Те трябва задължително да имат елемент title, който да съдържа описание на ресурса към който водят. Също от значение е и присъствието на ключова дума в самия URL. Най-голямо значение за съдържанието на една страница се дава на елемента <title>, <meta name="description"> както и на <h1>, <h2>, <h3>. google не отчита вече елемента <meta name="keywords">, но има други търсачки, които го използват. Ето как е реализиран файла news-file.php:

<?php

    $basepath='/code/mod_rewrite/';

    $news=array(
        1=>array(
            'content'=>'На сайта http://ustrem.org може да намерите статии за различни статии за php, mysql, apache и други linux приложения',
            'date'=>'2006-09-16',
            'title'=>'Описание на сайта Ustrem.org'
            ),
        2=>array(
            'content'=>'Публикувано е ръководство за използването на mod_rewrite за постигане на псевдо-статични адреси. Това позволява по-добро индексиране от търсещите машини, както и скриване на реализацията на сайта.',
            'date'=>'2006-09-17',
            'title'=>'Ръководство за статични адреси с mod_rewrite'
            ),
    );

    $id=intval($_REQUEST['id']);

    if (isset($news[$id]))
    {
        // imame izbrana nowina   
?>       
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title><?= htmlspecialchars($news[$id]['title']) ?></title>
    <meta name="description" content="<?= htmlspecialchars($news[$id]['title']) ?>" />
    <meta name="keywords" content="<?= htmlspecialchars(ereg_replace('\s+', ', ', $news[$id]['title'])) ?>" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>       
    <h1><?= htmlspecialchars($news[$id]['title']) ?></h1>
    <strong><?= htmlspecialchars($news[$id]['date']) ?></strong>
    <br />
    <p><?= htmlspecialchars($news[$id]['content']) ?></p>
    <br />
    <a href="<?= $basepath ?>news/" title="Обратно към всички новини">Всички новини</a>
</body>
</html>   
<?php
    }
    else
    {
        // pokaji spisyk s nowinite
?>       
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <title>Новини</title>
    <meta name="description" content="Новини" />
    <meta name="keywords" content="Новини" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>       
    <h1>Новини</h1>
<?php
    foreach ($news as $k=>$v)
    {
?>       
    <p>
        <a href="<?= $basepath ?>news/<?= $k ?>-<?= urlencode($v['title']) ?>.html"
            title="<?= htmlspecialchars($v['title']) ?>">
            <?= htmlspecialchars($v['title']) ?>
        </a>
    </p>   
<?php
    }
?>   
</body>
</html>   
<?php
    }

?>


Променливата $basepath е със същото съдържание както и RewriteBase. Един недостатък на този подход е че не може да използвате относителни пътища за ресурсите, така че всички картинки, .js, .css файлове, както и линкове трябва да са с абсолютен път. Новините са реализирани като масив, но може да се преработят и до база данни. Когато е избрана новина, елементите title, description, keywords се попълват с нейното заглавие. То също се поставя и в <h1> таг. При списъка със всички новини, на елемента <a> се задава title и същият този текст се залепя след 1 тире в URL-a. Получава се нещо от типа http://mysite.com/news/23-novina. Това не пречи на правилната работа, защото регулярния израз взима само първото число след /.

За завършек ето и къде можете да видите в действие примера, изложен по-горе - реализация на статични адреси с mod_rewrite

Коментари:

todor_dj (24-05-2009 16:29) :
Браво бе! Голямо чудене падна докато намеря това описание. Много благодаря.

Обратно към списъка със статиите

Тази страница последно е променяна на 2024-04-29 02:47:22