У меня есть каталог изображений, которые поочередно просматриваются непосредственно в браузере и загружаются в другое время.
Итак, скажем, у меня есть файл /gallery/gal_4254.jpg.
Я хочу, чтобы /download/gal_4254.jpg запускал загрузку изображения, а не просматривал его. / загрузка пуста, все изображения находятся в / gallery.
Я могу успешно сопоставить запросы к каталогу загрузки с другими файлами
<Directory /var/www/download> RewriteEngine on RewriteRule (.*)$ /gallery/$1 </Directory>
и я уже могу принудительно загружать файлы в галерею галереи, установив
<Directory /var/www/gallery/> ForceType "image/jpg" Header set Content-Disposition "attachment" </Directory>
поэтому настройка заголовков не проблема. Я вообще не хочу, чтобы галерея имела заголовки, просто запросы на / gallery / * through / download /, которые были переписаны.
Но мне нужно объединить эти два, поэтому запрос сопоставляется с файлом в другом каталоге, и файлу присваивается заголовок вложения.
#does not work - just views the image like when it is viewed directly <Directory /var/www/download> ForceType "image/jpg" Header set Content-Disposition "attachment" RewriteEngine on RewriteRule (.*)$ /gallery/$1 </Directory>
Я попытался изменить порядок разделов перезаписи и заголовка безрезультатно. Я думаю, что он теряет заголовок, когда запрос переписывается в другой каталог.
Любые предложения о том, как это сделать в Apache?
Я понимаю, что это можно сделать и с PHP, поэтому я разместил его здесь и по ошибке сервера. Также приветствуется решение с использованием PHP.
Простое решение php:
download.php
header('Content-Type: image/jpeg'); header('Content-Disposition: attachment; filename='.$_GET['img']); readfile('gallery/'.$_GET['img']);
.htaccess
<Directory /var/www/download> RewriteEngine on RewriteRule (.*)$ /download.php?img=$1 </Directory>
Комбинированным решением может быть следующая настройка. Сначала измените запись в каталоге:
<Directory /var/www/download> RewriteEngine on RewriteRule (.*)$ download.php?getfile=$1 </Directory>
Файл download.php должен содержать что-то вроде этого (NOT TESTED):
<?php if ($_GET['getfile']){ $file = '/var/www/gallery/' . $_GET['getfile']; } $save_as_name = basename($file); header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); header('Pragma: no-cache'); header("Content-Type: application/octet-stream"); header("Content-Disposition: disposition-type=attachment; filename=\"$save_as_name\""); readfile($file); ?>
Это должно перенаправить все запросы загрузки на download.php, который, в свою очередь, обрабатывает запросы и заставляет диалог сохранения.
Павел
Я просто сделал это, после спотыкания на вашем примере 😉 Я уверен, что вам просто нужно изменить раздел «Каталог / var / www / download» на «Location / download» в вашем последнем примере, и вы в порядке ,
Обоснование: «Каталог» относится к результирующему физическому каталогу, ПОСЛЕ того, как произошли перезаписи, тогда как «Местоположение» относится к исходному URI, независимо от того, произошли ли какие-либо перезаписи, чтобы найти физический файл.
Поскольку mod_rewrite – это огромный хак, который применяется в разное время, эффект вашего кода не очень очевиден.
То, что у меня есть в моей работе:
<Location /contents/> Header set Content-Disposition "attachment" </Location> ... RewriteRule ^.*(/e-docs/.*)$ $1
Таким образом, URL-адреса, такие как /contents/myimage.jpg AND /contents/e-docs/myimage.jpg, получают заголовок Content-Disposition, хотя /contents/e-docs/myimage.jpg на самом деле является / e-docs / myimage. jpg, как говорит переписывание.
Избежание PHP для этого имеет дополнительное преимущество, которое вы можете обслуживать этими изображениями и потенциально огромными видеофайлами (как в моем случае) с легким статическим сервером Apache, а не с back-end-процессом PHP-hog.