Хорошо, у меня есть WAMP-установка с установленным mod_xsendfile - он загружается в папку modules
в папке Apache под WAMP, и соответствующие строки добавляются в 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\"
Вот PHP-файл, который возвращает файлы через X-Sendfile:
<?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, чтобы маскировать размещение файлов на сервере от пользователя.
(Этот вопрос был впервые задан при сбое сервера, но они предложили перенести его сюда)
ОБНОВЛЕНИЕ Я попытался перейти непосредственно к showfile.php и загрузить туда изображение, и я получил новую ошибку:The image “http://uploadr.loc/showfile?imgfile=05_196132738.jpg” cannot be displayed because it contains errors.
как alt
текст. Независимо от того, какое изображение я пытаюсь загрузить, оно возвращает эту ошибку. Протестировал точно такие же картинки на моей MAMP-настройке, они работают просто отлично. Так что мне интересно, есть ли что-то конкретное либо с установкой Windows, либо путем к файлу, который создает проблему?