PHP奇怪的DOCUMENT_ROOT

2024-01-12

基本上,我正在编写一个框架,作为其功能的一部分,它应该为最终开发人员提供一组完善的 URI/路径。

其中两条路径利用$_SERVER['DOCUMENT_ROOT']:

/**
 * Absolute filesystem path to web root install (aka docroot).
 * @example "C:/wamp/www" OR "/home/visitgoz/public_html/"
 */
CFG::set('ABS_WWW',
    str_replace(
        $tmpseps,
        DIRECTORY_SEPARATOR,
        truepath($_SERVER['DOCUMENT_ROOT']).'/'
    )
);

/**
 * K2F path relative to web root.
 * @example /K2F/
 */
CFG::set('REL_K2F',
    str_replace(
        array('//','\\'),
        '/',
        str_replace(CFG::get('ABS_WWW'),'/',CFG::get('ABS_K2F'))
    )
);

该代码经过微调,可以在 Linux 和 Windows 上运行。显然,它有效mostLinux 上的时间,事实上在 VPS 上相当无缝。

然而,最近,我在一个HG 经销商帐户 http://www.hostgator.com/resellers.shtml(共享主机)一切都破裂了。 我已在有问题的机器上打印出 $_SERVER 内的数据:

Array
(
**  [DOCUMENT_ROOT] => /usr/local/apache/htdocs
    [GATEWAY_INTERFACE] => CGI/1.1
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_LANGUAGE] => en-gb,en;q=0.5
    [HTTP_CONNECTION] => keep-alive
    [HTTP_COOKIE] => <snip>
    [HTTP_HOST] => <snip>
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_USER_AGENT] => <snip>
    [PATH] => /bin:/usr/bin
    [QUERY_STRING] => 
    [REDIRECT_STATUS] => 200
    [REMOTE_ADDR] => <snip>
    [REMOTE_PORT] => 49262
    [REQUEST_METHOD] => GET
    [REQUEST_URI] => /~sitename/
**  [SCRIPT_FILENAME] => /home/sitename/public_html/index.php
    [SCRIPT_NAME] => /~sitename/index.php
    [SERVER_ADDR] => <snip>
    [SERVER_ADMIN] => <snip>
    [SERVER_NAME] => <snip>
    [SERVER_PORT] => 80
    [SERVER_PROTOCOL] => HTTP/1.1
    [SERVER_SIGNATURE] => 
Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635 Server at <snip> Port 80


    [SERVER_SOFTWARE] => Apache mod_fcgid/2.3.5 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
    [UNIQUE_ID] => TVox-Eo1Z8IAAG1kAh4AAAEZ
    [PHP_SELF] => /~sitename/index.php
    [REQUEST_TIME] => 1297756668
    [argv] => Array
        (
        )

    [argc] => 0
)

还有我的机器:

Array
(
    [HTTP_AUTHORIZATION] => 
    [HTTP_HOST] => <snip>
    [HTTP_USER_AGENT] => <snip>
    [HTTP_ACCEPT] => text/html,application/xhtml+xml,application/xml;q=0.9;q=0.8
    [HTTP_ACCEPT_LANGUAGE] => en-gb,en;q=0.5
    [HTTP_ACCEPT_ENCODING] => gzip,deflate
    [HTTP_ACCEPT_CHARSET] => ISO-8859-1,utf-8;q=0.7,*;q=0.7
    [HTTP_KEEP_ALIVE] => 115
    [HTTP_CONNECTION] => keep-alive
    [PATH] => <snip>
    [SystemRoot] => C:\Windows
    [COMSPEC] => C:\Windows\system32\cmd.exe
    [PATHEXT] => .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    [WINDIR] => C:\Windows
    [SERVER_SIGNATURE] => 
    [SERVER_SOFTWARE] => Apache/2.2.11 (Win32) PHP/5.3.1
    [SERVER_NAME] => <snip>
    [SERVER_ADDR] => <snip>
    [SERVER_PORT] => 80
    [REMOTE_ADDR] => <snip>
**  [DOCUMENT_ROOT] => C:/wamp/www/
    [SERVER_ADMIN] => admin@localhost
**  [SCRIPT_FILENAME] => C:/wamp/www/K2F/cms/cms-joomla-1.5/index.php
    [REMOTE_PORT] => 49947
    [GATEWAY_INTERFACE] => CGI/1.1
    [SERVER_PROTOCOL] => HTTP/1.1
    [REQUEST_METHOD] => GET
    [QUERY_STRING] => 
    [REQUEST_URI] => /K2F/cms/cms-joomla-1.5/
    [SCRIPT_NAME] => /K2F/cms/cms-joomla-1.5/index.php
    [PHP_SELF] => /K2F/cms/cms-joomla-1.5/index.php
    [REQUEST_TIME] => 1297758541
)

** 你应该读出的部分应该完美地解释我的问题。

所以基本上,预期的DOCUMENT_ROOT is /home/sitename/public_html/,但我却得到了/usr/local/apache/htdocs.

哦,抱歉,如果我有点太冗长了;)

Edit:

getcwd() => /home/visitgoz/public_html

__FILE__ => /home/visitgoz/public_html/K2F/config.php


那些(便宜的)大众主机经常会使用一些 Apache URL 重写技巧 - 这基本上使他们的生活变得更轻松,因为只有一台 Apache V 主机,所有共享网站都有一个文档根。

在这种情况下要找到“真实”文档根:

  • 从左到右比较 DOCUMENT_ROOT 和 SCRIPT_FILENAME。如果没有匹配的路径组件,则它是共享主机。
  • 如果是这样的共享主机,请从示例中的 SCRIPT_NAME => "index.php" 中删除 REQUEST_URI。
  • 然后:从 SCRIPT_FILENAME => 你的 DOCUMENT_ROOT (/home/sitename/public_html/) 末尾删除上面的结果

编辑(克里斯蒂安·西贝拉斯):这是正确的答案,但它缺少代码,无论如何我都必须编写代码,所以这里是:

if(strpos($_SERVER['SCRIPT_FILENAME'],$_SERVER['DOCUMENT_ROOT'])===false){
    // how it works on reseller accounts...
    $path=str_common(getcwd(),__FILE__);
}else{
    // how it normally works...
    $path=truepath($_SERVER['DOCUMENT_ROOT']).'/';
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP奇怪的DOCUMENT_ROOT 的相关文章

  • 纠正装饰器模式的一个大缺点

    不久前 我在重构一些游戏战斗代码时决定尝试装饰器模式 战斗者可以拥有各种被动能力 也可能是不同类型的生物 我认为装饰器可以让我在运行时以各种组合添加行为 因此我不需要数百个子类 我几乎已经完成了 15 个左右的被动能力装饰器 在测试中我发现
  • 递归获取数组的键并创建下划线分隔的字符串

    现在我得到了一个包含某种信息的数组 我需要从中创建一个表 例如 Student Address StreetAddress gt Some Street StreetName gt Some Name Marks1 gt 100 Marks
  • 如何使用 PHP 正确添加跨站请求伪造 (CSRF) 令牌

    我正在尝试为我网站上的表单添加一些安全性 其中一个表单使用 AJAX 另一个表单是简单的 联系我们 表单 我正在尝试添加 CSRF 令牌 我遇到的问题是令牌有时只显示在 HTML 值 中 其余时间 该值为空 这是我在 AJAX 表单上使用的
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 当数据验证失败时保留表单字段中的值

    我在弄清楚验证失败时如何保留用户数据时遇到问题 我对 PHP 有点陌生 所以我的逻辑可能会犯一些巨大的错误 目前 如果验证失败 所有字段都会被清除 并且 Post 数据也会消失 这是一些代码 假设用户输入无效电子邮件 我希望保留 名称 字段
  • 删除PHP字符串中所有不匹配的字符?

    我有一个文本 我想从中删除所有不属于以下字符的字符 所需字符 0123456789 abcdefghijklmnopqrstuvwxyz n 最后一个是我确实想保留的 n 换行符 要匹配除列出的字符之外的所有字符 请使用反转字符集 http
  • PHP MySQL 使用选项/选择 HTML 表单标签进行多重搜索查询

    我正在尝试使用两个搜索字段设置基本的 MySQL LIKE 搜索 我不想拥有它 所以它有多个可选搜索字段 例如if isset POST city isset POST name 我不知道如何用 HTML 来做到这一点
  • 生成大随机数 php [重复]

    这个问题在这里已经有答案了 我想使用 PHP 生成一个包含 75 个字符的数字 我到处寻找 但一无所获 除了这个 http dailycoding com tools RandomNumber aspx http dailycoding c
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • preg_match_all 查询仅显示有问题的外部组

    我无法弄清楚如何只显示 preg 查询的外部组级别 我会给你一个例子 preg match all start end input matches 这个输入start1 start2 2end 1end产生这个输出start1 start2
  • 从 .phar 存档中提取文件

    对于 Phar 文件 我完全错过了一些东西 我正在安装一个需要 phpunit pdepend 和其他依赖项的项目 我将它们作为 phar 文件获取 但是 我无法使用命令行工具 php 命令 从中提取文件 我用谷歌搜索了这个问题 但没有发现
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • 使用 Ajax.Request 将 JSON 从浏览器传递到 PHP 的最佳方法

    您好 我有一个 JSON 对象 它是一个二维数组 我需要使用 Ajax Request 将其传递给 PHP 我知道的唯一方法 现在我使用js函数手动序列化我的数组 并获取以下格式的数据 s 1 d 3 4等 我的问题是 有没有办法更直接 有
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 如果循环中内存超出,我可以在 for 循环中抛出异常吗?

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何处理 foreach 循环中发生
  • 表单提交后如何保留选择字段中的选定值?

    我有一个用于将票证上传到数据库的主页 我有一个选择字段 我想保留用户在提交表单之前选择的值 但它没有发生 这是我选择字段的代码
  • 内部 while 循环不工作

    这是我项目网页上的代码片段 这里我想显示用户选择的类别 然后想显示属于该类别的主题 在那里 用户可以拥有多个类别 这没有问题 我可以在第一个 while 循环中打印所有这些类别 问题是当我尝试打印主题时 结果只显示一行 但每个类别中有更多主
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3
  • 简单的 PHP 表单:电子邮件附件(代码 Golf)

    想象一下 一个用户想要在其网站上放置一个表单 该表单将允许网站访问者上传一个文件和一条简单的消息 该消息将立即通过电子邮件发送 即 该文件未存储在服务器上 或者如果该文件存储在服务器上 仅暂时 作为文件附件 并在邮件正文中添加注释 查看更多

随机推荐

  • 将 ASP.NET 4 Web 应用程序部署到 IIS6 服务器后,工作进程回收导致其大部分时间停止工作

    这是一个非常奇怪的情况 所以希望我能很好地解释它 我正在将 ASP NET 4 Webforms 应用程序部署到运行 IIS6 的 Windows Server 2003 SP2 服务器 问题是 当应用程序池回收其工作进程 w3wp exe
  • python中二维数组操作的高效并行化

    我正在尝试使用二维数组上的并行操作joblibpython 中的库 这是我的代码 from joblib import Parallel delayed import multiprocessing import numpy as np T
  • 初始化静态库中嵌入的qt资源

    我有下一种情况 我需要在独立静态库中创建小部件 然后将其与最终应用程序 Visual C 9 0 qt 4 5 链接 这个静态小部件库包含一些资源 图标 并由多个 cpp 文件组成 每个文件都包含独立的小部件 据我所知 如果我在静态库中使用
  • 如何使用 Fabric.js 设置对比度和饱和度

    我想在图像编辑器中设置对比度 饱和度和色调 为此 我使用fabric js 但它只有亮度选项 这是我的 Fabric JS 代码 function fabric Object prototype transparentCorners fal
  • 如何有效地将用户添加到 GitLab 中的所有项目(以编程方式或其他方式)

    我有一个包含许多项目的 GitLab CE 服务器 我想向所有项目添加用户 如果可能的话 我希望避免通过 UI 项目 gt 设置 gt 成员 gt 将用户添加到项目 来执行此操作 因为这将花费大量时间 实现此目的的一种方法是将所有项目移至一
  • XML 数据与命名空间的绑定

    我想使用 XML 文档的数据绑定来填充一个简单的表单 该表单显示有关人员列表的详细信息 我已经把一切都设置好了 现在就这样工作
  • 在设置和部署中预编译网站

    每次我使用安装和部署创建一个新的 Web 安装程序并运行它 在编辑属性中的所有好东西之后 输出始终是网站项目的副本 如何输出 WebSite 项目的预编译版本 我所做的是 发布网站 这样我就得到了预编译版本 将这个新的预编译网站作为现有网站
  • 在VBA中循环指定工作表

    我正在尝试使用我在这里找到的一些代码对于每个函数 循环遍历特定命名的工作表 https stackoverflow com questions 21761697 for each function to loop through speci
  • PyCharm 无法识别我的 Python 安装路径

    这是同样的问题this https stackoverflow com questions 23125024 rubymine doesnt recognize my ruby installation path否则 但为了Python 问
  • Babel 文件被复制而不进行转换

    我有这个代码 use strict import browserSync from browser sync import httpProxy from http proxy let proxy httpProxy createProxyS
  • 如何在Python中绘制悬挂根图?

    受此启发question https mathematica stackexchange com questions 120174 how to draw a hanging rootogram in mathematica 如何在 pyt
  • 如果下限大于上限,则创建空序列的序列构造

    不止一次体现R的 聪明 seq函数在极端情况下对我造成了严重的打击lower upper 1 gt 1 0 1 1 0 gt seq 1 0 1 1 0 gt seq 1 0 1 Error in seq default 1 0 1 wro
  • RethinkDB 如何生成自动 ID?

    我正在编写一个脚本 该脚本应该合并来自基于 SQL 的数据库的一些数据 每行都有一个长整数作为主键 增量 我正在考虑对这些 id 进行哈希处理 以便它们在某种程度上 看起来 像我的 RethinkDB 表中已有的其他 id 我在这里试图实现
  • 6 位整数的正则表达式不能是连续或重复的数字?

    我正在尝试获取一个正则表达式来检查以确保提供的 int 是 6 位数字 并且它不是连续的 也不包含所有重复数字 无论是升序还是降序 我并不关心正则表达式是否返回与不允许的数字的匹配 或者返回与允许的原始数字的匹配 例如 所有这些数字都是我需
  • Android 自动圆形图库

    我的图库小部件包含 1 10 张要滑动的图像 我知道当我在屏幕上进行条纹时 图像从左向右滚动 我想要自动循环图库在 10 后自动从第一张图像开始 有没有自动循环适配器或方法 final Gallery g Gallery findViewB
  • Scala XML 支持如何工作?

    我确信这应该是显而易见的 但我可以找到有关我的问题的任何参考资料 Scala XML 使用什么底层技术 它是类似 DOM 或 SAX 或 StAX 的东西吗 处理大型文档时我应该注意哪些性能损失 StAX 是否更高效 提前致谢 可以处理大文
  • CSS 变量名中允许使用句点吗?

    例如 我可以有一个名为如下的 css 变量 Button onHover 请注意 CSS 变量与 CSS 选择器不同 我必须解释这一点 因为有人将其标记为重复项 这是模块中的示例superfly css 变量 颜色 https github
  • 如何抛出不会终止我的程序的 IllegalArgumentException?

    好吧 我有一个带有 switch 语句的方法 但我省略了其余的情况 因为它们并不重要 在我的主要方法中 调用运算符方法并在 while 循环中传递参数 选择 直到他们选择 Q 当用户输入负数时 它应该抛出异常 打印一条消息 并忽略他们的输入
  • 在流畅的界面中实现条件

    我一直在尝试为我的系统中的一组规则实现一个流畅的界面 我想要完成的是这个 TicketRules RequireValidation When quartType gt quartType QuartType Before TotalMil
  • PHP奇怪的DOCUMENT_ROOT

    基本上 我正在编写一个框架 作为其功能的一部分 它应该为最终开发人员提供一组完善的 URI 路径 其中两条路径利用 SERVER DOCUMENT ROOT Absolute filesystem path to web root inst