2009-05-22 72 views
0

我已经继承了大量严格编码的PHP文件,其输出需要以编程方式进行修改。PHP include()受mod_rewrite影响

要做到这一点,我选择了通过其他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的影响。我浏览了模块文档,但找不到任何相关的内容。

当然,这种方法的替代方案也是受欢迎的。

谢谢你的时间和想法。

最好的问候,
丹尼尔

+0

极不可能。又有什么错误信息? – Gleb 2009-05-22 18:18:11

+0

您确定您的脚本正在从您期望的目录运行吗?这可能看起来像被重定向。 – Dave 2009-05-22 18:27:17

+0

你正在从每个目录conf文件(.htaccess)文件或主apache conf文件(httpd.conf文件)的上下文中运行这些重写规则。conf)文件? – 2009-05-22 20:25:49

回答

2

的听起来你正在寻找的RewriteCond,这本质上是mod_rewrite的

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

这将防止您的规则被应用到URL的条件语句结束rewriter.php。

-1

包括使用你它指的是文件系统的方式,绕过国防部重写翻译引擎。

我会看你的正则表达式。

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

匹配空字符串也。

尝试

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

,看看是否$ _GET [ '页']为空。

1

你应该首先检查文件是否包括之前存在:

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

这会工作,但会为网站的每个请求添加一个额外的文件统计信息。在低流量网站上可能不是什么大问题,但通过在Apache级别处理很容易避免。 – 2009-05-22 21:54:14

0

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

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

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