【问题标题】:Access a file which is located before / outside the server root directory?访问位于服务器根目录之前/之外的文件?
【发布时间】:2012-11-01 17:16:17
【问题描述】:

我正在为一家售后客户服务企业制作 Intranet。员工需要能够将 img 文件上传到 Intranet 的服务器,我需要将它们存储在 www 之前的目录中(网站的根目录)。

使用 php 执行此操作非常简单,但是一旦上传这些图像,如何将它们包含在网站上? 我试过这段代码

<img src="../img/img.png"/>

这不起作用,因为如果文件位于服务器的 www 目录之外,我将无法发送文件...

有什么合适的方法吗?

当前树视图:

server root directory
           |www
               |(all server files)
           |img
               |(all img files)

(服务器的index.php位于www,文件在img)

【问题讨论】:

  • 为什么要将这些文件放在 Web 根目录之外?你想隐藏它们吗?
  • 因为另一个团队会使用 FTP 访问这些文件并使用它们,所以这些文件不能在服务器目录中
  • 那么你想用php复制这些文件吗?
  • 将请求的文件复制到 tmp 目录可能是一种解决方案,这就是我目前寻求建议的原因
  • 那么我的建议是:创建可从 apache(从 php)访问的虚拟目录。您可以从那里复制文件(通过使用 php)并从另一个位置提供它们。不要忘记授予对源文件的读取权限。

标签: php document-root


【解决方案1】:

您不能直接访问根目录之外/之上的文件(www 或 public_html)。

您可以在 Apache 服务器配置中创建虚拟目录。谷歌“apache 虚拟目录”了解更多信息。

虚拟目录配置示例:

<IfModule alias_module>
  Alias /uploaded_images/ "/home/someuser/somewhere"
  <Directory "/home/someuser/somewhere">
    Allow from all
  </Directory>
</IfModule>

uploaded_images 目录将像 www 目录中的普通目录一样从 web 获得。您可以将文件从那里复制到另一个位置(一种缓冲)。

您也可以通过 ftp 从 php 级别打开/复制该文件,而无需更改 apache 中的任何内容,但这可能真的很慢(仅当您无法控制 apache 配置时才使用它,虚拟目录要好得多)。

php.net: FTP

【讨论】:

  • 我知道,实际上我是在要求一种 php 方式(比如缓存 img 或其他东西)在客户端请求时访问文件
  • 我在回答中添加了一些(生病的?)想法
  • 我不会为此使用 FTP(哇 - 这将是一个巨大的开销)。为什么不简单地将文件复制到本地?
  • 嗯..您可以使用 PHP 在本地复制文件。 php.net/copy -- 他为什么要使用 FTP?
  • 是的。例如。 (如果 CWD 是 ./www/:copy('../img/myimage.png','myimage.png'); - 现在可以通过 &lt;img src="myimage.png" /&gt; 访问 - 不需要 FTP。
【解决方案2】:

您无法直接访问 Web 目录之外的任何文件。由于您的问题也包括标签 PHP,我假设您可能想要使用它。

你可以做的是:

在您的 www 目录中,创建一个“image.php”文件,其内容类似于:

<?php
  header('Content-Type: image/png');
  readfile("../img/" . $_GET['img']);
?>

并用

调用您的图像
<img src="image.php?img=myimage.png" />

请注意,您的 PHP 文件不应该那么简单 :) 因为您可能想要处理多种图像格式(并为它们提供正确的标题),检查恶意文件路径/包含(您不希望使用 $_GET 而不验证/清理输入),额外的缓存等等等等。

但这应该让您了解如何定位您的问题。

【讨论】:

  • 您可以使用通配符* 选择多种图像类型,即:header('Content-Type: image/*');
【解决方案3】:

这取决于您要完成什么以及如何完成。 使用“简单”的 html 命令,就像您发现的那样。您不能转到 www 根目录之外的目录。 (例如,对于 C 上的 xampp 应用程序,大部分时间是 c:\xampp\htdocs)。

如果您可以使用服务器端命令来完成您想要实现的目标,那么您可以使用 php 来解决问题,方法是通过 PHP 读取相应的文件。 例如,如果您的文件名为“myimg.gif”并且位于“c:\pics”

<img SRC="data:image/gif;base64,<?php echo base64_encode(file_get_contents("c:\pics\myimg.gif"));?>">

这样您就可以读取文件的内容并将其直接写入 img 标签。 请注意,您需要将图像/gif 更改为您真正需要的内容。

【讨论】:

  • 我知道数据黑客,但这真的不是跨浏览器,例如 IE8 将文件限制为 32 ko ...
  • 这很有趣。我不知道 IE8 的限制。如果是这种情况,那么“GeneSys”提供的解决方案将是通往那里的方法(带有额外的安全部件,因此它不能被用来入侵您的网站)。
  • @ThomasE。 Wikipedia (en.wikipedia.org/wiki/Data_URI_scheme#Disadvantages) 列出了使用数据方案时的一些缺点。不过,如果只包含几张小图片,我想您的方式可能是“足迹”最少的方式。
  • @GeneSys:Tnx。那里关于缓存的部分非常有趣。
  • PHP有读取mimetype的功能,不用手动php.net/manual/en/function.mime-content-type.php
【解决方案4】:

我同意@kamil 关于创建虚拟目录的想法。但是如果你想走 php 路线,我写了一些代码,在 WWW 之前的目录中打开图像并将它们复制到 www/images 文件夹。

<?php 
$imagepath = "../images/";
define('IMGPATH', realpath($imagepath).DIRECTORY_SEPARATOR);
$cachewwwimg = "images/";
$imagename = 'image.jpg';
copy(IMGPATH.$imagename, $cachewwwimg.$imagename)
?>

<img src="<?php echo $cacheimg.$imagename;?>"/>

【讨论】:

  • 将文件复制到“虚拟”(临时?)目录并让网络服务器从那里加载文件有什么好处,而不仅仅是通过 PHP“传输”文件?
  • @GeneSys : Weacked 要求使用 php 方式,因为他不希望其他团队访问服务器目录。
  • 嗯.. 你也可以用 PHP 实现我所要求的吗?事实上,我什至已经给出了答案。我只是问:为什么要复制文件而不是输出它们?
【解决方案5】:

我通过简单地创建一个指向主机上的全局物理文件夹的符号链接解决了这个问题。我没有 root 访问权限,所以我创建了一个简单的 PHP 文件,将其命名为 symbolic_link.php,我将它放在我网站的根目录中,并为我创建了符号链接。这里是:

<?php
$target = '/home/<user>/images/';   // hosting physical directory
$link = 'images';                   // symbolic link inside root of web site
unlink($link);
symlink($target, $link); 

创建符号链接后,我删除了文件。

这是托管目录结构:

/home/<user>                        // hosting root   
|
+--/images                          // hosting global dir
|  |
|  +--/logo.png                     // global image
|
+--/www.website.com                 // hosting website dir
   |
   +--/images                       // symbolic link

现在您可以像在网站文件夹中一样使用图片了:

<img src="https://www.website.com/images/logo.png" alt="..."> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-30
    • 2016-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    相关资源
    最近更新 更多