PHP:如何不对Web应用程序root进行硬编码

时间:2011-07-04 17:01:06

标签: php web-applications path document-root

我目前在我的应用程序的配置文件中有以下内容:

define('DOCROOT', dirname(__FILE__).DIRECTORY_SEPARATOR);
define('WEBROOT', 'http://localhost/samples/');

第一行完美无缺。我可以在任何地方包含配置文件,然后按预期使用DOCROOT常量。

第二行也适用,但它是硬编码的,这意味着当我将此文件上传到我的网络服务器时,它将是错误的。它应该是http://samples.example.com。是否有一种好方法可以防止这种硬编码?我觉得我必须在某个地方硬编码,在那种情况下,我可以逃脱的是什么和多少?

5 个答案:

答案 0 :(得分:3)

我使用以下代码查找基本网址:

function getBaseURL() {
    return 'http' . (isset($_SERVER['HTTPS']) ? 's' : '') . '://'
         . $_SERVER['HTTP_HOST']
         . rtrim(dirname($_SERVER['SCRIPT_NAME']), '/\\')
         . '/'
    ;
}

答案 1 :(得分:2)

define('WEBROOT', 'http://'.$_SERVER['HTTP_HOST'].'/');

答案 2 :(得分:1)

您可以更进一步,并确保用户是否通过HTTPS访问,您为他们提供HTTPS ....

    if (isset($_SERVER["HTTPS"]) && $_SERVER['HTTPS'] == 'on') {
            $target_url = "https://" . $_SERVER["SERVER_NAME"];
    } else {
            $target_url = "http://" . $_SERVER["SERVER_NAME"];
    }
   define('WEBROOT', $target_url);

答案 3 :(得分:0)

“破解”这种方法的一种方法是检查外部请求IP。如果ip为127.0.0.1,则将WEBROOT定义为http://localhost/samples,否则将其定义为http://samples.example.com

答案 4 :(得分:0)

'http://'.$_SERVER['HTTP_HOST']. str_replace(str_replace("\\","/",str_replace(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR, "", realpath($_SERVER['SCRIPT_FILENAME']))), "", $_SERVER['PHP_SELF']);

我在localhost上测试过它。 把它放在配置文件中。