Intereting Posts

Как переписывать и устанавливать заголовки одновременно в Apache

У меня есть каталог изображений, которые поочередно просматриваются непосредственно в браузере и загружаются в другое время.

Итак, скажем, у меня есть файл /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.