我继承了许多编码严重的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的影响。我查看了模块文档,但找不到任何相关内容。
当然,也欢迎采用这种方法的替代方案。
感谢您的时间和思考。
最好的问候,
丹尼尔
答案 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']是否为空。