【问题标题】:Same-directory includes failing on a Fedora server with PHP同一目录包括在使用 PHP 的 Fedora 服务器上失败
【发布时间】:2010-06-12 02:41:22
【问题描述】:

我有几个看起来像这样的文件:

index.php:

<?php  
include('includes/header.php');

...

包含/header.php:

<?php
include('config.php');

...

我得到的错误是

警告:require(config.php) [function.require]:无法打开流:第 2 行的 [dir]/includes/header.php 中没有这样的文件或目录
致命错误:require() [function.require]:无法在 [dir]/includes/header 中打开所需的 'config.php' (include_path='.:/usr/share/pear:/usr/share/php')。 php 在第 2 行

我做了一些进一步的调试:当我添加调用时

system('pwd');

到includes/header.php,它显示[dir],它应该说[dir]/includes。将“includes/”添加到包含路径是可行的,但不可取,因为这会在生产服务器上失败。

上面的代码在生产服务器上运行,在我的开发 Fedora 服务器上运行良好,直到我尝试更改我的开发环境,以便 Fedora 服务器的文档根目录是一个挂载的 CIFS 共享。

有什么想法吗?谢谢。

【问题讨论】:

    标签: php linux apache samba


    【解决方案1】:

    工作正常...直到我尝试更改我的开发环境以使 Fedora 服务器的文档根目录成为已挂载的 CIFS 共享。

    是否启用了 SELinux?

    查看/var/log/audit/audit.log

    我打赌 SELinux 已启用并处于强制模式,并且正在干扰。

    【讨论】:

    • 是的,它们都在同一个目录中。而且 ../config.php 不起作用,就像我说的那样,就好像它在父目录中一样,因为 include 'includes/config.php' 确实起作用。
    • 我重写了我的答案,因为我在发布后立即意识到我错了。请检查我的更新,看看这次可能实际上是正确的。 ;)
    • 它目前处于许可模式,SELinux 是我检查的第一件事之一(这几乎是我存在的祸根),我用这种方式清除了几个问题。 audit.log 没有显示任何看似拒绝的内容。
    • 标题内部realpath(\_\_FILE__) 的输出是什么? dirname(\_\_FILE__) 的输出是什么? dirname 中给出的目录应该与 realpath 中给出的完全相同的路径,并且两者都应该匹配文件的位置。当根据dirname(\_\_FILE__) 的修改结果给出完全限定路径时,包括 config.php 是否有效?
    • realpath(__FILE__) 为空,dirname(__FILE__) 正确,require(dirname(__FILE__).'/config.php')) 有效。似乎可能没有正确填充 realpath 值?
    【解决方案2】:

    我不想这么说,但是您描述的 pwd 的行为是 100% 预期的行为(并且至少从 PHP4 开始......可能更早)。

    PHP 自动设置当前工作目录(由 pwd 使用)一次。 PHP 不会改变它。因此, 。除非您使用 chdir() 手动更改它,否则将引用原始当前工作目录。

    这个问题有多种解决方案;其中大部分你可以在PHP include file strategy needed看到。

    如果它以前有效,则可能在某处对 include_path 进行了一些更新,更改工作目录的代码不再更改它,或者您使用的实现这种奇怪(但更预期)行为的 php 版本不再这样做.

    无论如何,我会检查包含路径:ini 文件或更改包含路径的脚本。我猜测用于更新 include_path 的东西,但不再这样做了。

    我不确定您如何移动它的详细信息,但我遇到了一些烦人的脚本,其中 .htaccess 将 auto_prepend_file 设置为完全位于网站结构之外的文件的硬编码路径,从而设置包含路径 (除其他外)到网络结构内部的某个地方。

    【讨论】:

      【解决方案3】:

      使用选项“noserverino”安装 CIFS 共享应该可以解决问题,例如:

      mount -t cifs -o noserverino //host/share /mnt
      

      可以在此处找到有关此工作原理的完整说明:http://www.php.net//manual/en/function.is-dir.php#98338

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-13
        • 1970-01-01
        • 1970-01-01
        • 2015-11-24
        相关资源
        最近更新 更多