从层次结构中更深层的文件中调用$ _SERVER ['SCRIPT_NAME']

Noo*_*low 9 php

(初步说明:这里似乎有很多这个问题的变体,但它们似乎都集中在物理PHP文件本身的文件系统位置,而不是事物的Web URL位置,这就是我所追求的.)


简介1:

我有一个小的"网站",具有以下物理文件系统结构:

variable.php
folder
  test.php
Run Code Online (Sandbox Code Playgroud)

(换句话说,variable.php在顶级和test.php文件夹中folder.)

这是文件内容:

<?php
//variable.php
$basePath = dirname($_SERVER['SCRIPT_NAME']);
?>

<?php
//test.php
include("../variables.php");
echo $basePath;
?>
Run Code Online (Sandbox Code Playgroud)

简介2:

在本地开发此"网站"时,它位于以下地址:

http://localhost/~noob/test-website
Run Code Online (Sandbox Code Playgroud)

题:

问题是,如果我放入http://localhost/~noob/test-website/folder/test.php浏览器,它会打印出来/~noob/test-website/folder/.

我希望它打印出来/~noob/test-website(variable.php的"web位置").换句话说,我想从所有文件中的全球访问,甚至那些在文件系统层次更深,对/~noob/test-website.我该如何做到这一点?

我显然不想对此路径进行硬编码.原因是当我将其上传到生产服务器时,位置会变得更加清晰http://example.com/(并且我不希望在上传到之后修改此硬编码路径)服务器,当然这个问题).

Lei*_*igh 4

这里的问题是,您的网络服务器(以及 PHP)不知道您的测试根目录是从子目录中提供的,事实上它们都不关心。

显而易见的解决方案是在每个服务器上提供一个配置脚本,其中包含硬编码的相对根。正如您已经说过的,您不想这样做。(提供特定于服务器的配置文件实际上并不是一件坏事,很多人做了更荒谬的事情)

为了解决这个问题,解决方案必须取决于针对特定请求可用的参考点。这些参考点是:

  • 文件系统位置variables.php
  • 所请求脚本的文件系统位置。
  • 文件系统位置,是提供页面的根目录

(我知道您强调的不是文件系统- 继续阅读,我们使用这些来获取您的价值)

使用这些值,目录结构中将会出现重叠。这就是你所追求的价值。

例子:

  • 您的测试站点位于:http://localhost/c/
  • 要求:http://localhost/c/d/myscript.php
  • Variables.php 位于:/a/b/c/variables.php
  • myscript.php 位于:/c/d/myscript.php 包含 ../variables.php

正如您所看到的,路径与/c/目录重叠。

在您中,variables.php您可以使用以下代码来计算重叠。

$fsRoot = __DIR__; // dirname(__FILE__) for PHP < 5.3 (and shame on you!)
$webRoot = str_replace($_SERVER['PHP_SELF'], '', $_SERVER['SCRIPT_FILENAME']);
$urlRoot = str_replace($webRoot, '', $fsRoot);
Run Code Online (Sandbox Code Playgroud)

你永远不应该依赖DOCUMENT_ROOT它,它很容易出错,所以我们自己计算它($webRoot变量)。

这将获取站点根目录中的文件系统目录,并删除作为页面服务基础的文件系统目录。剩下的是实际 Web 根目录和子目录 Web 根目录之间的所有内容。variables.php

myscript.php可以执行以下操作。

print $urlRoot . '/filename.js';
Run Code Online (Sandbox Code Playgroud)

该示例的输出将是/c/filename.js