【问题标题】:PHP include() affected by mod_rewrite受 mod_rewrite 影响的 PHP include()
【发布时间】:2009-05-23 04:41:04
【问题描述】:

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

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

感谢您的时间和思考。

最好的问候,
丹尼尔

【问题讨论】:

  • 极不可能。错误信息又是什么?
  • 您确定您的脚本是从您期望的目录运行的吗?这看起来像是被重定向了。
  • 您是从每个目录配置文件 (.htaccess) 文件还是主 apache 配置文件 (httpd.conf) 文件的上下文中运行这些重写规则?

标签: php apache mod-rewrite


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢,Alan,这就是我要找的 wat。这比我预期的要容易得多。
【解决方案2】:

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

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

【讨论】:

  • 这可行,但会为对站点的每个请求添加额外的文件统计信息。在低流量网站上可能没什么大不了的,但通过在 apache 级别处理很容易避免。
【解决方案3】:

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

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

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

【讨论】:

  • 这行不通。一个文件不能同时是普通文件(-f)和目录(-d)。
【解决方案4】:

包含使用您引用文件系统的方式并绕过 mod-rewrite 翻译引擎。

我会看你的正则表达式。

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

也匹配空字符串。

试试

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-10
    • 2013-09-10
    • 1970-01-01
    • 2016-12-31
    • 2019-08-14
    • 2019-05-23
    • 1970-01-01
    相关资源
    最近更新 更多