php链接到默认Web目录之外的图像文件
Posted
技术标签:
【中文标题】php链接到默认Web目录之外的图像文件【英文标题】:php link to image file outside default web directory 【发布时间】:2010-09-20 11:27:49 【问题描述】:这是目录结构
/domain.com
/public_html
/functions
/image
/mobile
/www
/domain.com/public_html/www 文件夹有一个文件 index.php 默认的网络目录是 /user/public_html/www 在索引文件中是一个包含函数 包括“../functions/function.inc” 这没有问题 当我想链接到图像文件夹中的图片时,我没有得到任何结果 例如
<img src="../image/graphic/logo.gif" />
有人知道为什么图片的链接不起作用以及如何正确链接到图片文件吗?
我试过<img src="<?php echo $_SERVER['PHP_SELF']; ?>../image/graphic/logo.gif" alt="alt text"/>
但这给了我相同的结果 当我围绕图像建立链接以访问属性时,我将其作为路径 http://domain.com/image/pc/tattoo_small/small_2008_10_22_001.JPG 路径应该是 http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG 当我尝试直接浏览到这个 url http://domain.com/public_html/image/pc/tattoo_small/small_2008_10_22_001.JPG 我收到 404 文件未找到错误 因为默认的 web 目录是 /domain.com/public_html/www 我试过了 http://domain.com/../image/pc/tattoo_small/small_2008_10_22_001.JPG 进入图像文件夹,但这也无济于事。
任何人有任何想法,或者是否不可能通过 html 链接到默认 web 目录之外的图形文件?
感谢您阅读本文
感谢到目前为止的回答。 我将尝试使用推荐的解决方案之一解决我的问题,并在此处报告我的工作解决方案。 我希望图像文件夹与 www 和 mobile 文件夹处于同一级别,因为用于 pc (www) 版本和移动版本的某些图像是相同的。 当然,在 www 和 mobile 文件夹中获取图像文件夹更容易,我认为这就是我要做的。
谢谢大家的建议。我不打算使用脚本的主要原因是脚本将是一个简单问题的困难解决方案,还因为我真的不知道如何将图像包装在 css 类中以及如何提供 alt图片的文字。
【问题讨论】:
【参考方案1】:您无法提供 Web 目录之外的页面,因为路径不起作用,即 http://mydomain.com/../page.html 只是指无法访问的位置。
如果您真的想提供 webroot 之外的(静态)文件,您可以编写一个小的 PHP 脚本来读取它们并输出它们。因此,您将请求重定向到 PHP 脚本,PHP 将从磁盘读取相应的文件并将其返回。
【讨论】:
而且你要非常小心地这样做,否则你会引入一个巨大的安全漏洞:)【参考方案2】:不可能直接链接到网络服务器的网络可访问区域之外的文件。
但是,您可以编写一个 PHP 脚本来为您代理图像
<img src="my_php_proxy.php">
因为 PHP 可以发送图像数据以及 HTML。此 PHP“图像”不限于与 Web 可访问的内容相同的文件夹,它可以访问服务器上的任何可读文件。请参阅http://www.electrictoolbox.com/image-headers-php/ 了解更多信息
【讨论】:
【参考方案3】:无法直接访问 webroot 之外的文件;这是一个内置的安全限制,这是有充分理由的。
但是,可以使用 PHP 脚本为您提供这些图像。这样您就可以调用如下图像:
/image.php?file=myfile.jpg
并使用file_get_contents() 获取文件内容并将它们打印到您的浏览器。您还应该将标头发送到客户端,在本例中使用 PHP 的 header() 函数。一个简短的例子:
<?php
$file = basename(urldecode($_GET['file']));
$fileDir = '/path/to/files/';
if (file_exists($fileDir . $file))
// Note: You should probably do some more checks
// on the filetype, size, etc.
$contents = file_get_contents($fileDir . $file);
// Note: You should probably implement some kind
// of check on filetype
header('Content-type: image/jpeg');
echo $contents;
?>
为此使用脚本还有一些优势:
例如,您可以跟踪下载并实施计数器 您可以将文件限制为经过身份验证的用户 ...等【讨论】:
你的脚本有一个重大的安全漏洞:它应该使用类似 $file = basename(urldecode($_GET['file'])) 的东西。否则,这可能有效:/image.php?file=../../../../../../../../etc/passwd 不符合http://php.net/manual/en/function.urldecode.php '对$_GET 或$_REQUEST 中的元素使用urldecode() 可能会产生意想不到的危险结果。'【参考方案4】:您可以在 public___html 中创建一个指向图像目录的链接,将图像目录移动到 public_html,或者,如果您特别喜欢复杂的解决方案,您可以编写一个脚本来读取图像文件并将其输出到用户(当然,除非您将所有图像都列入白名单,否则您可能会遇到潜在的安全问题)。
【讨论】:
【参考方案5】:如果你使用 Apache 作为服务器,你可以将它设置为 httpd.conf 中的一个目录的别名...
<IfModule mod_alias.c>
Alias /images/ "/User/Public_html/Image/"
<Directory "/User/Public_html/Image">
Options Indexes MultiViews
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</IfModule>
IIRC,别名文件夹不需要在 webroot 中。
【讨论】:
这给了我图像的“NetworkError:403 Forbidden”。有什么建议吗?【参考方案6】:在指向您想要的目录的 Web 根目录中创建符号链接。
cd public_html
ln -s ../images
Apache 需要 Options +FollowSymlinks
配置指令才能使其工作(您可以将它放在您的 Web 根目录中的 .htaccess
中)。
编写从外部 Web 根目录提供文件的 PHP 脚本违背了 Web 根目录的目的。您必须非常仔细地验证路径以避免将整个磁盘暴露给网络。
【讨论】:
以上是关于php链接到默认Web目录之外的图像文件的主要内容,如果未能解决你的问题,请参考以下文章
考虑到我的图像的链接存储在 MySQL 数据库中,如何通过 php 显示存储在文件夹中的图像
在输入'php artisan storage:link'命令后,如何使用Laravel链接存储文件夹在Heroku上显示图像?