213  /  330

Настройка ЧПУ

Просмотров: 4360 (Статистика ведётся с 06.02.2017)

Для хранения идентификаторов элементов/разделов информационных блоков удобнее всего использовать поле Символьный код. Например, в ссылке 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=com­puterra.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;
}
}
?>

Примеры

Пример 1

Новости вида /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
    
  • Обработчик 404 ошибки
    <?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");
    }
    ?>

Дополнительно

Как убрать "PHPSESSID=..." из URL?

Чтобы избавиться от идентификатора сессии в URL, раскомментируйте строку в /.htaccess:

php_flag session.use_trans_sid off

Если это не дает результата, необходимо изменить значение параметра session.use_trans_sid на Off непосредственно в php.ini на сервере.

Удостоверьтесь, также, что значение параметра session.use_cookies установлено в On.


Как убрать из URL страницы знак вопроса?

Для этого необходимо выполнить следующие шаги:

  • создать в каталоге /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");
    ?>

12
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии