Реализиране на статични адреси с 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) :
Браво бе! Голямо чудене падна докато намеря това описание. Много благодаря.
Обратно към списъка със статиите
Тази страница последно е променяна на 2025-04-27 09:00:02