好的 - 我有一个安装了 mod_xsendfile 的 WAMP 设置 - 它被加载到modules
WAMP 下的 Apache 文件夹中的文件夹中,并且已添加相应的行httpd.conf
,并且当我通过 WAMP 图标检查可用模块时,该模块会显示在列表中。
但是,我无论如何都无法让它真正发挥作用。我在开发的网页中使用它来将缩略图/图像/文件发送到图库,这在我第一次开发的 MAMP 服务器上运行良好。我使用 PHP 作为后端,并在此处发布相关代码 - 如果您需要其他任何东西,我很乐意提供。
第一的:httpd.conf
LoadModule xsendfile_module modules/mod_xsendfile.so
<IfModule mod_xsendfile.so>
<Files *.php>
XSendFile On
SetEnv MOD_X_SENDFILE_ENABLED 1
</Files>
</IfModule>
我不太确定这一点,但我也尝试过这个,但没有成功:
# Enable mod_xsendfile
#permitted values on/off
XSendFile on
# XSendFilePath allow you to add additional paths to some
# kind of white list. All files within these paths are
#allowed to get served through mod_xsendfile
XSendFilePath "c:\wamp\www\uploadr\users\"
以下是通过 X-Sendfile 返回文件的 PHP 文件:
<?php
require_once('conf/config.php');
if (!session_id()) { session_start(); };
$username = (($isloggedin && isset($_GET['user'])) ? $_GET['user'].'/' : ((!$isloggedin) ? 'public/' : $username));
if (!empty($_SERVER['QUERY_STRING']) && $username != 'public/') {
$potential_public_file = explode('__',explode('=',$_SERVER['QUERY_STRING'])[1])[0];
for ($i = 0; $i < count($user_array); $i++) {
$exploded_user_array = explode('//',$user_array[$i]);
if (($potential_public_file == trim($exploded_user_array[0]))) {
$username = 'public/';
}
}
}
if ($debug == true) {
logThis('showfile_processing','Username is set to '.$username.''."\r\n",FILE_APPEND);
}
if (isset($_GET['imgfile'])) {
header('Content-type: image/jpeg');
if (isset($_GET['thumbs'])) {
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'pictures/thumbs/'.$_GET['imgfile']);
} else {
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'pictures/'.$_GET['imgfile'].'');
}
} elseif (isset($_GET['docfile'])) {
header('Content-Disposition: attachment; filename='.$_GET['docfile'].'');
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'documents/'.$_GET['docfile'].'');
} elseif (isset($_GET['vidfile'])) {
if (isset($_GET['thumbs'])) {
if ($debug == true) {
logThis('showfile_processing','Thumbs loaded '.$_GET['vidfile']."\r\n",FILE_APPEND);
}
header('Content-type: image/jpeg');
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'video/thumbs/'.$_GET['vidfile']);
} else {
if ($debug == true) {
logThis('showfile_processing','Video returned '.$_GET['vidfile']."\r\n",FILE_APPEND);
}
header('Content-Disposition: attachment; filename='.$_GET['vidfile'].'');
header('X-Sendfile: '.$_SERVER['DOCUMENT_ROOT'].'/'.$userpath.$username.'video/'.$_GET['vidfile'].'');
}
}
exit;
?>
我从 gallery.php 文件中调用这些文件,如下所示:showfile.php?imgfile=<name_of_file>
- 它基本上读取一个目录,并通过 X-Sendfile 提取文件,以向用户掩盖文件在服务器上的位置。
(这个问题最初是在 Server Fault 上提出的,但他们建议我将其移到这里)
更新
我尝试直接转到 showfile.php 并在那里加载图像,然后出现新错误:
The image “http://uploadr.loc/showfile?imgfile=05_196132738.jpg” cannot be displayed because it contains errors.
as an alt
-text。无论我尝试加载哪个图像,它都会返回此错误。在我的 MAMP 设置上测试了完全相同的图片,它们工作正常。所以我想知道 Windows 设置或文件路径是否存在特定问题导致了问题?
答案1
哇,我花了很长时间才发现这一点,但我在这里找到了答案:https://stackoverflow.com/questions/7133819/x-sendfile-on-apache2-php-serving-0b-file-no-errors-though
我必须将其设置XSendFilePath
为C:/
- 然后它神奇地起作用了。这就是 Windows 为您准备的...