Здравствуйте, товарищи. У меня есть такой вот скрипт, для преобразования XML на стороне сервера. Мне нужно туда прикрутить код, который бы формировал ссылки вида «index.php?p=article1234», то есть, чтобы этот файлик (скрипт) стал индексным файлом. Помогите пожалуйста это решить. Заранее благодарен. Собственно скрипт: Код (PHP): <?php ini_set('error_reporting', E_ALL); ini_set('display_errors', 1); define('ROOT', preg_replace('#\\\+#', '/', __DIR__)); define('PATH', $_SERVER['PATH_INFO']); $xmlfile = ROOT . (file_exists(ROOT . PATH) ? PATH : '/404/index.xml'); // Загружаем xml файл и кастуем XInclude $xmldoc = new DOMDocument('1.0', 'UTF-8'); $xmldoc->preserveWhiteSpace = false; $xmldoc->formatOutput = true; $xmldoc->load($xmlfile); $xmldoc->xinclude(); // Определяем какой xsl применить к xml $xslts = array(); $xpath = new DOMXPath($xmldoc); $pi = "/child::processing-instruction('xml-stylesheet')"; foreach ($xpath->evaluate($pi) as $node) { if (preg_match('#type=([\'"])text/xsl\1#i', $node->data) && preg_match('#href=([\'"])([^\'"]+)\1#i', $node->data, $matches)) { $xslts[] = $matches[2]; } } // Если xsl шаблон не задан, то xml файл надо отобразить без изменений if (!count($xslts)) { header('Content-Type: text/xml; charset=UTF-8'); printf($xmldoc->saveXML()); } // Иначе применяем xsl к xml и отображаем результат преобразования else { $tmp = getcwd(); // в xml файле ссылка на xsl указана относительная chdir(dirname($xmlfile)); // поэтому чтобы корректно загрузить xsl надо сначала // перейти в папку с xml $xslprc = new XSLTProcessor(); foreach ($xslts as $xslfile) { $xsldoc = new DOMDocument('1.0', 'UTF-8'); $xsldoc->load($xslfile); $xslprc->importStylesheet($xsldoc); } chdir($tmp); header('Content-Type: text/html; charset=UTF-8'); printf($xslprc->transformToXml($xmldoc)); } ?> Подсказка от модератора: Любой код или текст конфигурации пишите между тегом [code=php] и [/code]. Используйте отступы в коде для форматирования текста. Это помогает быстрее понять вас, увеличивает шанс на получение ответа. Что выделять? Например: PHP, HTML, CSS, JavaScript, SQL, XML, .htaccess, ini, регулярные выражения, код шаблонизаторов, любая другая разметка, результаты array/object dump и т. д.
Ну как я понимаю, туда надобно добавить, что-то вроде «. $_GET['p'] …», чтобы, при наборе в адресной строке «my_site.org/index.php?p=article_1» стартовал файл index.php с этим скриптом и тащил бы за собой содержимое файла article_1.xml. Как-то так . Я совсем новичок в php, могу сформулировать глупо, но, к сожалению, это всё, на что я способен
пусть $xmlfile ровняется $_GET['p'].'.xml' и чисти $_GET['p'] от всего кроме 0-9a-z_-. чтобы безопасно было
А можно в примере? А то, я кофейник вообще. Добавлено спустя 2 минуты 57 секунд: Дело в том, что нужно чтобы этот скрипт склейки XML/XSL, выполнял также роль индексного файла, вроде index.php, как в простых движках, использующих не СУБД, а текстовые или .xml-файлы.
Код (PHP): if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) { $xmlfile = preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p']).'.xml'; } else { $xmlfile = '404.xml'; }
denis01, спасибо, вам. Скажите, а как сделать, чтобы при неправильном значении «p=» (т. е., при несуществующем адресе) выдавало тоже 404 ошибку? А то, просто ругается вот этим: Код (PHP): This page contains the following errors: error on line 2 at column 1: Extra content at the end of the document Below is a rendering of the page up to the first error.
в блок else вставь Код (PHP): header("HTTP/1.0 404 Not Found"); и выводи текст, что ничего не найдено
Вот так: Код (PHP): if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) { $xmlfile = 'xdata/xml/' . preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p']) . '.xml'; } else { header("HTTP/1.0 404 Not Found"); echo '404'; exit(); //$xmlfile = 'xdata/xml/404.xml'; } Все равно ругается. Т. е., если вместо существующего «index.php?p=201203130730» набрать «index.php?p=201203130730Н», то пишет то же, что я приводил выше. А надо бы 404.xml. Беда прямо… Я добавил вот это: Код (PHP): if(!is_file($xmlfile)) { die('Error 404'); } но, по моему, это костыль и вообще как-то коряво . Может нужно как-то «обобщить», т. е., если в строке после адреса сайта написана ахинея (любое несоответствие существующему URL), то сразу выдавать 404?
Почему, собственно, оно должно отдавать 404? Если: Код (PHP): if ($_SERVER['REQUEST_METHOD'] === 'GET' && empty($_GET['p']) === false) { Переданные параметры соответствуют шаблону. а Код (PHP): preg_replace('/[^0-9a-z-_]/iu', '', $_GET['p']) Благополучно выполняет поиск и замену. Если вы хотите проверить наличие файла по нужному пути на сервере, можно применить функцию file_exists указав полный путь до папки с файлам.