PHP include()受mod_rewrite影响

时间:2009-05-22 18:06:52

标签: php apache mod-rewrite

我继承了许多编码严重的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的影响。我查看了模块文档,但找不到任何相关内容。

当然,也欢迎采用这种方法的替代方案。

感谢您的时间和思考。

最好的问候,
丹尼尔

4 个答案:

答案 0 :(得分:2)

听起来你正在寻找RewriteCond,它本质上是mod_rewrite的条件语句

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

这将阻止您的规则应用于以rewriter.php结尾的网址。

答案 1 :(得分:1)

在包含文件之前,您应首先检查文件是否存在:

if ($_GET['page'] != 'rewriter' && is_file($_GET['page'].'.php')) {
    include $_GET['page'].'.php';
} else {
    // file does not exist or is invalid
}

答案 2 :(得分:0)

你可以在你的htaccess中添加一个RewriteCond条件,检查文件是否存在。类似于Gumbo的评论,除了稍快一点(并且代码更轻量级)。

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

检查它是否是相对于您网站根目录的文件或目录。如果是,它将运行重写器。快速触摸.htaccess真棒:)

答案 3 :(得分:-1)

包含按照你的方式使用,参考文件系统并绕过mod-rewrite转换引擎。

我会看你的正则表达式。

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

也匹配空字符串。

尝试

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

并查看$ _GET ['page']是否为空。