PHP include () зависит от mod_rewrite - PullRequest
0 голосов
/ 22 мая 2009

Я унаследовал несколько строго закодированных PHP-файлов, вывод которых мне нужно изменить программно.

Для этого я решил запустить их через другой PHP-файл rewriter.php, который выглядит примерно так:

<?php
if(!preg_match('/^([a-zA-Z0-9\-_]*)$/', $_GET['page']))
  die('Incorrect page supplied.');
ob_start('changeOutput');

include($_GET['page'].'.php');
ob_end_flush();

function changeOutput ($buffer) {
  ...
}
?>

Я использую mod_rewrite, чтобы заставить их проходить через этот файл:

RewriteEngine On
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 

Однако отображается сообщение об ошибке, которое заставляет меня поверить, что на оператор include () влияет RewriteRule, описанный выше, то есть он пытается запустить rewriter.php через rewriter.php и т. Д.

Полагаю, есть много способов решения этой проблемы, но я специально ищу способ избежать воздействия на оператор include () mod_rewrite. Я просмотрел документацию к модулю, но не смог найти ничего подходящего.

Конечно, альтернативы этому подходу тоже приветствуются.

Спасибо за ваше время и мысли.

С уважением,
Daniel

Ответы [ 4 ]

2 голосов
/ 23 мая 2009

Похоже, вы ищете RewriteCond, который по сути является условным оператором для mod_rewrite

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !rewriter.php$
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1 [L]

Это предотвратит применение вашего правила к URL, которые заканчиваются на rewriter.php.

1 голос
/ 22 мая 2009

Вы должны сначала проверить, существует ли файл, прежде чем включать его:

if ($_GET['page'] != 'rewriter' && is_file($_GET['page'].'.php')) {
    include $_GET['page'].'.php';
} else {
    // file does not exist or is invalid
}
0 голосов
/ 22 мая 2009

Вы можете добавить условный RewriteCond к вашему htaccess, который проверит, существует ли файл. Аналогичен комментарию Gumbo, за исключением чуть более быстрого (и более легкого кода).

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^([^\.]*)\.php$ rewriter.php?page=$1

Это проверяет, является ли это файл или каталог относительно корня вашего сайта. Если это так, он запустит программу перезаписи. Быстрое прикосновение .htaccess awesomeness:)

0 голосов
/ 22 мая 2009

Включить используется, как вы это делаете, обращаться к файловой системе и обходить механизм перевода мод-перезапись.

Я бы посмотрел ваше регулярное выражение.

/^([a-zA-Z0-9\-_]*)$/ 

также соответствует пустой строке.

Попробуйте

/^([a-zA-Z0-9\-_]+)$/ 

и посмотрите, является ли $ _GET ['page'] пустым или нет.

...