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

时间:2012-10-14 22:28:49

标签: php

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


INTRO 1:

我有一个小型“网站”,其中包含以下物理文件系统结构:

variable.php
folder
  test.php

(换句话说,顶层为variable.php,文件夹test.phpfolder。)

以下是文件内容:

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

<?php
//test.php
include("../variables.php");
echo $basePath;
?>

INTRO 2:

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

http://localhost/~noob/test-website

问题:

问题在于,如果我将http://localhost/~noob/test-website/folder/test.php放入浏览器,则会打印出/~noob/test-website/folder/

我希望它打印出/~noob/test-website(variable.php的“网址”)。换句话说,我希望从所有文件(甚至更深层次的文件系统层次结构)中对/~noob/test-website进行全局访问。我该如何做到这一点?

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

10 个答案:

答案 0 :(得分:4)

问题在于,您的网络服务器(以及PHP)不知道您的测试根目录是在子目录中提供的,实际上他们都不关心。

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

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

  • 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);

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

这会占用您网站根目录中variables.php文件系统目录,并删除 filesystem 目录,该目录是从中提供网页的基础。剩下的是实际的Web根目录和子目录Web根目录之间的所有内容。

myscript.php中,您可以执行以下操作。

print $urlRoot . '/filename.js';

示例的输出为/c/filename.js

答案 1 :(得分:3)

希望这将会接近(所有这些都应该在variables.php中):

// folder containing the requested script
$requested = dirname($_SERVER['SCRIPT_FILENAME']);

// folder containing variables.php
$current = dirname(__FILE__);

// relative path from variables.php to the requested script
$relative = str_replace($current, '', $requested);

// remove relative path from end of script name
$pattern = '#' . preg_quote($relative) . '$#';
$basePath = preg_replace($pattern, '', dirname($_SERVER['SCRIPT_NAME']));

注意:这看起来适用于您的特定示例,但这意味着variables.php必须始终位于DOCUMENT_ROOT的文件夹中,或者是DOCUMENT_ROOT的父文件夹,否则相对使用上述方法无法确定路径。

答案 2 :(得分:1)

我不确定它会永远解决你的问题,但是它可以在你的例子中起作用:

$x = explode("/", $_SERVER['SCRIPT_NAME']);
echo $_SERVER['SERVER_NAME'] . '/' . $x[1] . '/';

如果您喜欢输出,可以根据自己的需要进行自定义。 :)

答案 3 :(得分:1)

这并非完全万无一失,但Kurogo使用的解决方案在大多数情况下都有效。

https://github.com/modolabs/Kurogo-Mobile-Web/blob/release-1.5/lib/Kurogo.php#L797

它基本上是在比较REQUEST_URIDOCUMENT_ROOT,并不断添加REQUEST_URIDOCUMENT_ROOT的文件夹,直到匹配为止。一旦从dirname(__FILE__)建立起来,它就会发现WEBROOT_DIR(在你的情况下可能是来自变量.php的DOCUMENT_ROOT),它会将现有路径保存为你的$ urlBase。

这仅适用于子文件夹/符号链接,并且不处理apache别名之类的内容,因此它可能不适用于您的案例,但它至少是答案的一部分。

答案 4 :(得分:0)

我在一个项目中工作,需要读取包含大量图像的目录,其中包含文件夹,并且需要以递归方式读取所有文件...

<强>功能:

function ListIn($dir, $prefix = '') {
  $dir = rtrim($dir, '\\/');
  $result = array();

    foreach (scandir($dir) as $f) {

        if ($f !== '.' and $f !== '..') {

            if (is_dir("$dir/$f")) {
              $result = array_merge($result, ListIn("$dir/$f", "$prefix$f/"));
            } 
            else {
                $ext = substr($prefix.$f, strrpos($prefix.$f, '.') + 1);

                if(in_array($ext, array("jpg"))){
                    // echo $prefix.$f."<br>";
                    $result[] = $prefix.$f;
                }


            }

        }

    }

  return $result;
}

使用方法:

$path='images/mytest';

$images = (ListIn($path));

foreach($images as $image){
        $image=explode("/",$image);
        echo $image=$image[2];
}

正如您所看到的,每个图像都成为一个数组,您可以访问该数组的第一个元素,以便提取您想要的目录...在这种情况下,它位于第二个索引处。数组,取决于文件结构的深度......

我希望这可以帮到你!

答案 5 :(得分:0)

  

我显然不想硬编码这条路径。原因是   当我将其上传到生产服务器时,位置会更改为   像http://example.com/更健全的东西(我不想拥有   因此,在上传到服务器之后修改此硬编码路径   这个问题当然是。)

您可以对路径进行硬编码,只需将其设置为相对于主页即可。

例如,http://localhost/~noob/test-website/http://example.com是相同的。所以只关心下面的事情。

答案 6 :(得分:0)

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

[HR] [/ HR] INTRO 1:

我有一个小型“网站”,其中包含以下物理文件系统结构:

variable.phpfolder test.php(换句话说,顶级的variable.php和文件夹文件夹中的test.php。) 以下是文件内容:

[HR] [/ HR] INTRO 2:

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

的http://本地主机/〜小白/测试网站[HR] [/ HR]问题:

问题是,如果我把

localhost / ~noob / test-website / folder / test.php进入我的浏览器,打印出来~~ noob / test-website / folder /.

我希望它打印出来〜/ noob / test-website(variable.php的“web位置”)。换句话说,我想从所有文件(甚至是文件系统层次结构中更深层次的文件)到/ ~noob / test-website进行全局访问。我该如何做到这一点?

我显然不想对此路径进行硬编码。原因是当我将其上传到生产服务器时,位置会更改为http://example.com/更合理的内容(我不想这样做)上传到服务器后修改这个硬编码路径,当然这个问题。)

答案 7 :(得分:0)

您可以根据您对特定文件夹和网络结构的了解来估算正确答案,但这远非一般解决方案。但我建议你使用一个boostrap文件,它是每个“页面”的入口点。在那里,您可以设置$basePath变量和其他所需的值。

你可以做的另一件事是从Apache注入你的$_SERVER数组的基本路径(如果你正在使用它。那么它将可供整个应用程序使用。

有关如何完成此操作的指针,您可以查看here

或者有一个包含给定服务器基本路径的配置文件。

答案 8 :(得分:-1)

我认为,您正在搜索docroot(外部表单) - 可以在$_SERVER['DOCUMENT_ROOT'](在文件系统中)找到它。与__DIR__(或早期PHP的dirname(__FILE__))比较

答案 9 :(得分:-1)

使用此功能: -

#This function will return the current script name
function get_script_name()
{
    $uri_array = explode('/',$_SERVER['SCRIPT_NAME']);
    $script_name = end($uri_array);
     return $script_name;
}
#call The function
$script_name = get_script_name();
echo $script_name;