(初步说明:这个问题似乎有很多变种,但它们似乎都集中在物理PHP文件本身的文件系统位置,而不是 web 事物的URL位置,这就是我所追求的。)
INTRO 1:
我有一个小型“网站”,其中包含以下物理文件系统结构:
variable.php
folder
test.php
(换句话说,顶层为variable.php
,文件夹test.php
为folder
。)
以下是文件内容:
<?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/
更加清晰(我不想要上传到服务器后修改这个硬编码路径,当然这个问题。)
答案 0 :(得分:4)
问题在于,您的网络服务器(以及PHP)不知道您的测试根目录是在子目录中提供的,实际上他们都不关心。
显而易见的解决方案是在每台服务器上提供一个configuraiton脚本,其中包含硬编码的相对根。正如您已经说过的,您不想这样做。 (提供特定于服务器的配置文件实际上并不是一件坏事,很多人做了更荒谬的事情)
为了解决这个问题,解决方案必须依赖于特定请求可用的参考点。这些参考点是:
variables.php
(我知道你强调不是文件系统 - 继续阅读,我们用这些来获取你的价值)
使用这些值,目录结构中将存在重叠。这是你追求的价值。
示例:
http://localhost/c/
http://localhost/c/d/myscript.php
/a/b/c/variables.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_URI
和DOCUMENT_ROOT
,并不断添加REQUEST_URI
到DOCUMENT_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;