Как переписать и установить заголовки одновременно в Apache - PullRequest
3 голосов
/ 02 марта 2010

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

Итак, скажем, у меня есть файл /gallery/gal_4254.jpg.

Я хочу, чтобы /download/gal_4254.jpg вызывал загрузку изображения, а не его просмотр. / скачать пусто, все изображения в /gallery.

Я могу успешно сопоставить запросы на загрузку в другие файлы

<Directory /var/www/download>
    RewriteEngine on
    RewriteRule (.*)$ /gallery/$1
</Directory>

и я уже могу принудительно загружать файлы в галерее dir, установив

<Directory /var/www/gallery/>
    ForceType "image/jpg"
    Header set Content-Disposition "attachment"
</Directory>

так что установка заголовков не проблема. На самом деле я не хочу, чтобы / gallery имел заголовки, просто переписал запросы / 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, поэтому я разместил его здесь, вместо Server Fault. Также будет приветствоваться решение с использованием PHP.

Ответы [ 3 ]

2 голосов
/ 02 марта 2010

Простое решение 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>
2 голосов
/ 02 марта 2010

Комбинированным решением может быть следующая настройка. Сначала измените запись каталога:

<Directory /var/www/download>
    RewriteEngine on
    RewriteRule (.*)$ download.php?getfile=$1
</Directory>

Файл download.php должен содержать что-то вроде этого (НЕ ИСПЫТАНО):

<?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, который, в свою очередь, обрабатывает запросы и выдает диалоговое окно сохранения.

Пол

1 голос
/ 08 июля 2010

Я только что сделал это, спотыкаясь на вашем примере ;-) Я уверен, что вам просто нужно изменить раздел «Directory / var / www / download» на «Location / download» в вашем последнем примере, и все в порядке.

Обоснование таково: «Каталог» применяется к результирующему физическому каталогу, ПОСЛЕ того, как произошли перезаписи, тогда как «Местоположение» применяется к исходному URI, независимо от того, произошли ли какие-либо перезаписи для поиска физического файла.

Поскольку mod_rewrite - это огромный хак, который применяется в разное время, эффект вашего кода не очень очевиден.

То, что у меня есть в моей рабочей настройке:

<Location /contents/>
    Header set Content-Disposition "attachment"
</Location>
...
RewriteRule ^.*(/e-docs/.*)$   $1

Таким образом, URL-адреса, такие как /contents/myimage.jpg и /contents/e-docs/myimage.jpg, оба получают заголовок Content-Disposition, хотя /contents/e-docs/myimage.jpg на самом деле является / e-docs /myimage.jpg файл, как говорит переписать.

Избегая для этого PHP, вы получаете дополнительное преимущество, заключающееся в том, что вы можете обслуживать эти изображения и потенциально огромные видеофайлы (как в моем случае) с помощью легкого статического сервера Apache, а не внутреннего процесса PHP, загружающего память.

...