http://site.ru/articles/2.html http://site.ru/articles/3.html http://site.ru/articles/4.html
MODX с такой задачей справляется довольно легко.
Необходимо только поправить ссылки в сниппете, например, pdoPage:
&tplPage=`@INLINE <li><a href="[[~[[*id]]]][[+pageNo]].html">[[+pageNo]]</a></li>` &tplPageActive=`@INLINE <li class="active"><a href="[[~[[*id]]]][[+pageNo]].html">[[+pageNo]]</a></li>` &tplPageFirst=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">Первая</a></li>` &tplPageLast=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">Последняя</a></li>` &tplPagePrev=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">«</a></li>` &tplPageNext=`@INLINE <li class="control"><a href="[[~[[*id]]]][[+pageNo]].html">»</a></li>`
И создать плагин, указав события OnPageNotFound и OnHandleRequest:
<?php
if ($modx->context->key == 'mgr') return '';
switch($modx->event->name) {
case 'OnHandleRequest':
if (strpos($_SERVER['REQUEST_URI'], '?page=')) {
$uri = str_replace('?page=', '', $_SERVER['REQUEST_URI']);
$modx->sendRedirect($uri, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
break;
case 'OnPageNotFound':
$alias = $modx->context->getOption('request_param_alias', 'q');
if (!isset($_REQUEST[$alias])) {return false;}
$request = $_REQUEST[$alias];
$tmp = explode('/', $request);
$p = array_pop($tmp);
$pageNo = str_replace('.html', '', $p);
if (is_numeric($pageNo)) {
if ($pageNo == $p) {
$modx->sendRedirect(implode('/', $tmp) . '/' . $pageNo . '.html', array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
}
if (!$section = $modx->findResource(implode('/', $tmp) . '/')) {
if (empty($tmp)) {
$section = $modx->getOption('site_start');
} else {
return false;
}
}
$_GET['page'] = $_REQUEST['page'] = $pageNo;
$modx->sendForward($section);
}
default:
break;
}
return '';
Объектная
$modx->sendRedirect(implode('/', $tmp) . '/' . $pageNo . '.html', array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));