【问题标题】:PHP absolute path not workingPHP绝对路径不起作用
【发布时间】:2015-08-29 20:06:07
【问题描述】:

我已经设置了一个简单的虚拟主机。

只是在底部添加了这些行

<VirtualHost *:80>
    ServerAdmin webmaster@yourdomain.com
    DocumentRoot "/var/www/Reminder/"


    <Directory "/var/www/Reminder">
        AllowOverride all
        Require all granted
        php_admin_value open_basedir "/var/www/Reminder/"
    </Directory>



    php_admin_value open_basedir "/var/www/Reminder/" 
    ServerName test.mydomain.com
    ErrorLog "logs/yourdomain.com-error_log"
    CustomLog "logs/yourdomain.com-access_log" common
</VirtualHost>

我基本上想要的是,虽然从 Reminder 文件夹内的文件中包含 php 中的文件,但如果我给出一个绝对路径,例如 "/test/" ,它应该将 Reminder 文件夹视为根,并搜索测试提醒里面的文件夹。

现在,当我输入 echo DIR 时,会显示 /var/www/Reminder。

我的文件结构是:

/var/www/Reminder/database/db_connect.php /var/www/Reminder/registration/registration_handler.php

这就是我的 db_connect.php 所拥有的:

<?php 

    define('DBHOST','localhost');
    define('DBUSER','root');
    define('DBPASS','password');
    define('DBNAME','Reminder');

    $conn=mysqli_connect(DBHOST,DBUSER,DBPASS) ;
    if(!$conn) { 

        echo mysqli_connect_error();

    }
    else {
        echo "connected successfully";
    }

?>

这是我的registration_handler拥有的:

<?php
    echo "hi";
    echo __DIR__;
    require_once("/database/db_connect.php");

    mysqli_query($conn,"INSERT INTO users () VALUES ()") or die (mysqli_error($conn));
?>

我相信,如果一切正常,如果我运行registration_handler.php,我应该能够获得“连接成功”消息(来自db_connect),但那没有发生。

当我包含这样的相同文件时:require_once("../database/db_connect.php"); ,我得到输出

【问题讨论】:

  • What I basically want is, ..., if I give an absolute path, ..., it should consider the Reminder folder as the root php 不能这样工作——也不应该这样。
  • 但是,当我在 hostgater 之类的地方托管一些文件时,执行 '/' 会为我提供网站根目录的路径。

标签: php virtualhost


【解决方案1】:

open_basedir 选项仅限制允许您从 PHP 代码访问的路径。它不会影响从 PHP 代码内部查找文件的方式。

这意味着将open_basedir 设置为/var/www/Reminder/ 将导致错误,例如,如果您尝试打开/etc/passwd(因为它超出了允许的目录)。它不会将/etc/passwd 的打开转换为/var/www/Reminder/etc/passwd

您可能想要的是使用__DIR__ 常量以便通过相对路径打开。例如,要从/var/www/Reminder/registration/registration_handler.php 加载/var/www/Reminder/database/db_connect.php,您可以使用类似:

$basedir = dirname(__DIR__);
require_once($basedir . '/database/db_connect.php');

我们使用dirname() 去除__DIR__ 末尾的最后一个路径组件。即:

  • __DIR__: /var/www/Reminder/registration
  • dirname(__DIR__): /var/www/Reminder

【讨论】:

  • 我没有注意到那部分。在那种情况下使用__DIR__ 应该是安全的,所以我更新了响应。 (我已经习惯了人们将代码部署到古老的 RHEL 或 CentOS 安装,所以我总是犹豫在 PHP 中使用任何“最近”的东西。)
猜你喜欢
  • 2013-07-06
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 2020-12-23
  • 2018-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-06-25
相关资源
最近更新 更多