Для хранения идентификаторов элементов/разделов информационных блоков удобнее всего использовать поле Символьный код. Например, в ссылке www.myserver.ru/catalog/mobile/nokia_3310/, mobile - это символьный код раздела Мобильные телефоны, а nokia_3310 - символьный код элемента, находящегося в разделе Мобильные телефоны. Символьный код должен быть уникальным и система сама проверяет уникальность.
В обработчике 404 ошибки необходимо "разобрать" переменную $_SERVER["REQUEST_URI"]
на нужные идентификаторы. Для этого в PHP есть ряд полезных функций:
Например, ссылки вида myserver.ru/users/<Логин пользователя> обрабатываются в файле 404.php так:
<? if(preg_match("~^/users/([a-z_][a-z0-9_]{2,14})/?$~i",$_SERVER["REQUEST_URI"],$match)) { header("HTTP/1.1 200 OK"); //делаем выборку по идентификатору require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $res = CUser::GetList($O, $B, Array("LOGIN_EQUAL_EXACT"=>$match[1],"ACTIVE"=>"Y")); //$match[1] содержит логин if($arUser = $res->GetNext()) { //выводим данные пользователя } else { //ошибка: нет такого пользователя } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); } else { header("HTTP/1.1 404 Not Found"); //ошибка } ?>
Но жесткая проверка в preg_match не позволит сделать ссылки вида www.myserver.ru/users/user_login/?r1=banner&r2=computerra.ru, которые очень необходимы для анализа рекламных компаний. Поэтому, в начале файла 404.php пишем:
<?$arURI = parse_url($_SERVER["REQUEST_URI"]); $_SERVER["REQUEST_URI"] = $arURI["path"]; if(!empty($arURI["query"])) { parse_str($arURI["query"],$par); foreach($par as $key => $val) { global $$key; $$key = $val; } } ?>
Новости вида /about/news/23.html (ссылка для печати /about/news/print_23.html) вместо /about/news/detail.php?ID=23 (/about/news/detail.php?ID=23&print=Y)
mod_rewrite RewriteEngine On RewriteBase / RewriteRule ^about/news/([0-9]+).html$ about/news/detail.php?ID=$1 RewriteRule ^about/news/print_([0-9]+).html$ about/news/detail.php?ID=$1&print=Y
<?if(preg_match("~^/about/news/(print_)?([0-9]+).html$~",$_SERVER["REQUEST_URI"],$match)) { header("HTTP/1.1 200 OK"); $_GET["print"] = (strlen($match[1])>0 ? "Y": ""); $_REQUEST["ID"] = $match[2]; include($_SERVER["DOCUMENT_ROOT"]."/about/news/detail.php"); } else { define("ERROR_404", "Y"); header("HTTP/1.1 404 Not Found"); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php"); $APPLICATION->SetTitle("404 - файл не найден"); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/footer.php"); } ?>
Чтобы избавиться от идентификатора сессии в URL, раскомментируйте строку в /.htaccess
:
php_flag session.use_trans_sid off
Если это не дает результата, необходимо изменить значение параметра session.use_trans_sid
на Off
непосредственно в php.ini на сервере.
Удостоверьтесь, также, что значение параметра session.use_cookies
установлено в On
.
Для этого необходимо выполнить следующие шаги:
/news/
файл .htaccess со следующим содержимым:
ErrorDocument 404 /news/404.php
/news/
файл 404.php со следующим содержимым:
<? $arrPath = pathinfo($_SERVER["REQUEST_URI"]); function initialize_params($url) { if (strpos($url,"?")>0) { $par = substr($url,strpos($url,"?")+1,strlen($url)); $arr = explode("#",$par); $par = $arr[0]; $arr1 = explode("&",$par); foreach ($arr1 as $pair) { $arr2 = explode("=",$pair); global $$arr2[0]; $$arr2[0] = $arr2[1]; } } } initialize_params($_SERVER["REQUEST_URI"]); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); $arr = explode("?",$arrPath["basename"]); $fname = $arr[0]; if (strlen(trim($arrPath["extension"]))>0) { $arr = explode(".",$fname); $NEWS_ID = intval($arr[0]); if ($NEWS_ID>0) { $ID = $NEWS_ID; $APPLICATION->SetTitle("News Details"); $sapi = php_sapi_name(); if ($sapi=="cgi") header("Status: 200 OK"); else header("HTTP/1.1 200 OK"); require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/iblock/iblock.php"); CIblock::ShowPanel($IBLOCK_ID, $ID); include($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/include/news/news_detail.php"); // интерфейсный скрипт, который вызывается //и в /news/detail.php } } require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog.php"); ?>