Mod Rewrite Rule正在改变PHP中的CWD - 为什么?

时间:2011-07-15 07:40:39

标签: php apache .htaccess mod-rewrite working-directory

我有一个奇怪的问题,我找不到文档。我的服务器中有以下位置的页面。

{SITE_ROOT}/admin/myfolder/myfile.php

此文件使用include来运行驻留在服务器根目录上的全局配置文件 - 它相对于自身执行此操作

// {SITE_ROOT}/admin/myfolder/myfile.php
// includes {SITE_ROOT}/config.php    See below explanation after edit
include('../config.php);

这很好用直到我将以下.htaccess文件添加到myfolder目录

// {SITE_ROOT}/admin/myfolder/.htaccess
RewriteEngine On
RewriteRule ^([0-9A-Z]+)\.gif$ gif_generator.php?gifid=$1 [L]

此规则的目的并不重要 - 事实是上面的页面(myfile.php)不应受此规则的影响(除非我错了,否则它不应该与正则表达式匹配 - 我可能好吧)。但似乎在使用此规则时,myfile.php中的include()会失败。就像启用了RewriteEngine一样,改变了php文件的当前工作目录。

这是否记录在任何地方,是否有办法防止这种情况发生?

编辑 - 我错过了一些非常重要的内容。原始文件({SITE_ROOT} /admin/myfolder/myfile.php)本身包含在以下位置的文件中({SITE_ROOT} /admin/frontcontroller.php)。 myfile.php中的include路径实际上是相对于 this 文件。我已经改变了上面的问题以反映这一点。

1 个答案:

答案 0 :(得分:0)

也许这对你有用:

dirname(__FILE__)

返回文件所在的目录。因此,如果您知道网站的目录结构,则可以使用类似

的内容。
dirname(dirname(__FILE__))

您也可以使用

DIRECTORY_SEPARATOR

获取特定于服务器操作系统的目录分隔符

在你的情况下,这将成为

include(rtrim(dirname(dirname(__FILE__)),'/\\').DIRECTORY_SEPARATOR.'config.php')