【问题标题】:PHP: How not to hard code web application rootPHP:如何不对 Web 应用程序根目录进行硬编码
【发布时间】:2011-09-28 06:57:53
【问题描述】:

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

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

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

第二行也可以,但它是硬编码的,这意味着当我将此文件上传到我的网络服务器时,它会出错。应该是http://samples.example.com。有什么好的方法可以防止这种硬编码吗?我有点认为我必须在某个地方硬编码一些东西,在这种情况下,我能逃过什么,能逃过多少?

【问题讨论】:

  • 我也对此感兴趣。我已经通过使用$_SERVER['SERVER_NAME'] 在此期间解决了这个问题。但是,我读到并非所有服务器都支持相同的 $_SERVER 选项,所以我不确定它的便携性如何
  • $_SERVER['SERVER_NAME'] 并没有什么问题,它是少数几个真正可用的选项之一,除非您希望将信息手动写入文件或数据库,然后返回作为变量。另一种选择是将您的大部分 DOM 应用程序重新编写成另一种语言,例如 ASP.NET 或 JavaScript,这些语言实际上在所有当前安装中都提供了这些变量。仅在 JS 中编写此对象的问题只是 PHP 将在 JS 之前解析,因此这是不可行的。好吧,这就是我在编写了一些网络应用程序之后对这种情况的看法

标签: php web-applications path document-root


【解决方案1】:
define('WEBROOT', 'http://'.$_SERVER['HTTP_HOST'].'/');

【讨论】:

  • 那将是当前正在运行的脚本或其他东西的路径,这就是 DOCROOT 给你的。除了我使用的东西会给我配置文件所在目录的目录,而不是正在运行的任何脚本。
  • 你知道$_SERVER['HTTP_HOST']$_SERVER['SERVER_NAME']有什么区别吗?它们似乎在我的测试机器上返回相同的值。
  • 在我的本地版本中这是错误的,你的代码将变成http://localhost/。应该是http://localhost/samples/
  • @Charles:也许可以将其用于冗余?如果一个没有设置,试试另一个?
  • @Svish,我想。你仍然可以使用这种方法。根据您定义代码的位置,您可以执行basename(dirname(__DIR__)) 之类的操作。如果设置正确,将为您提供安装目录的名称。然后,您可以将其粘贴到 define 的末尾。
【解决方案2】:

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

【讨论】:

  • 是的,最终可能会做类似的事情。虽然不喜欢它:p
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    你可以更进一步,确保如果用户通过 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);
    

    【讨论】:

    • 除非我的网络服务器也提供 HTTPS,否则这行不通...?
    • 它会起作用的。如果您的网络服务器现在或将来不提供 https,它将默认为 else { }
    【解决方案5】:
    'http://'.$_SERVER['HTTP_HOST']. str_replace(str_replace("\\","/",str_replace(realpath(dirname(__FILE__)).DIRECTORY_SEPARATOR, "", realpath($_SERVER['SCRIPT_FILENAME']))), "", $_SERVER['PHP_SELF']);
    

    我在 localhost 上对其进行了测试。 把它放在你的配置文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2012-03-12
      • 2018-06-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多