Apache在ubuntu 18.04上带有已安装映像目录的

时间:2019-03-01 14:17:27

标签: php image apache

我对通过apache2.4传递到Web浏览器的图片中的伪像有一个奇怪的问题。我们的comany使用中央图片存储存储所有产品图片。该目录安装在mnt / medamazonbild下的Web服务器中。我创建了一个符号链接,该链接指向img / artikel下的Web目录。这可以正常工作,并且该文件夹可以完全访问。

但是,一旦我通过chrome或firefox在目录下请求图片:

172.17.1.27/img/artikel/70399.jpg

输出附带工件。

Apache delivers the picture with artifacts.

出于测试目的,我尝试通过image.php中的PHP提供图像:

if (isset($_GET["img"])) {
    // get image name
    $img = filter_var($_GET["img"], FILTER_SANITIZE_STRING);

    // path of image with name and suffix
    $path = '/var/www/html/public/img/artikel/' . $img;

    header('Content-Type: image/jpeg');
    readfile($path);
}

结果是图像没有应有的伪像:

The output with the readfile function delivers the expected image

我不想用php处理所有图像的图像输出,因为我担心性能会下降。 如何获得针对Apache的解决方案,以按预期方式交付图像?错误在哪里?

设置

  • Ubuntu 18.04 LTS
  • Apache 2.4
  • 安装目录,其图片位于:mnt / medamazonbild
  • 从mnt / medamazonbild到webroot img / artikel的符号链接

2 个答案:

答案 0 :(得分:1)

我刚刚在 Azure (AKS) 的 Kubernetes 集群上遇到了完全相同的问题。

我们最近从 1.16.X 更新到 19.X.X,我们的 Wordpress 网站上的图片停止工作。尝试在 Chrome 中打开图像路径时,它下载了一个损坏的文件,而不是显示图像。

经过一天一洞的调试,我们做出了以下观察:

  • 从任何地方提供图像,但在安装内按预期工作
  • 我们确保文件共享的挂载权限与挂载外的文件夹和文件完全相同,在那里提供工作图像
  • 查看标题(curl -X HEAD -I https://path)时,它们的位置符合预期
  • 装载中的图像在下载时被更改 - 它在图像的开头添加了一些伪影(看起来像纯文本中的 HTTP 标头的东西),并且在比较图像的源代码时,它似乎包含一些错误编码的内容, 使图像看起来像 OP 中的图像

EnableSendfile on 添加到我们的 .htaccess 的简单解决方案解决了这个问题 - 非常感谢 @botf!

我们不知道为什么(也许一些 Apache 专家可以解释一下),但显然 Apache2 在从我们的安装中读取文件时存在一些问题。 我们的 AKS 集群上还有其他运行 NGINX 的服务,它们运行良好。

答案 1 :(得分:0)

我的图像上出现了相同类型的故障。 我正在使用官方docker image php:7.3-apache Docker Hub 为解决此问题,我在我的.htaccess文件中添加了EnableSendfile on(我认为它的工作原理与您将其添加到httpd.conf中一样)