2015-06-14 52 views
-1

我設置了一個簡單的虛擬主機。PHP絕對路徑不能正常工作

只是增加了這些線在底部

<VirtualHost *:80> 
    ServerAdmin [email protected] 
    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> 

我基本上要什麼,同時從提醒文件夾內,如果我給的絕對路徑,如「/測試/」文件包括PHP文件,它應該將Reminder文件夾視爲根,並從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)); 
?> 

我相信,如果一切正常,我應該能夠得到「連接成功」的消息(從db_connect),如果我運行registration_handler.php,但那不會發生。當我包含像這樣的文件:require_once(「../ database/db_connect.php」); ,我得到輸出

+2

'我基本上要爲......,如果我給的絕對路徑,...,應該考慮的提醒文件夾因爲root的php不能像那樣工作 - 也不應該這樣。 – AD7six

+0

但是,當我在hostgater等地方託管某些文件時,「/」會爲我提供我的網站根目錄的路徑。 –

回答

0

open_basedir選項僅限制您允許從PHP代碼訪問哪些路徑。它不會影響PHP代碼中的文件查找方式。

這意味着如果您嘗試打開例如/etc/passwd(因爲它在允許的允許目錄之外),則設置open_basedir/var/www/Reminder/將導致錯誤。它不會將開放的/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
+0

我沒有注意到這一部分。在這種情況下,使用'__DIR__'應該是安全的,所以我已經更新了響應。 (我很習慣將代碼部署到古老的RHEL或CentOS安裝中,我總是不願意在PHP中使用「近期」的任何東西。) – olav