2010-03-02 2 views
3

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

ответ

2

Простое решение 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

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

<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); 
?> 

Это shouldd перенаправлять все запросы скачать на download.php, которые в свою очередь, обрабатывает запросы и заставляет диалог сохранения.

Пол

+0

Спасибо! Поскольку вы и xaoc дали примерно тот же ответ на расстоянии 2 минуты, я перевернул монету, и xaoc получил признание. Тем не менее, у меня есть свой позитивный отклик. – JAL

1

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

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

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

Что я имею в моей установке workjing является:

<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, а не back-end PHP-хором.

+0

Отличный подход, спасибо за добавление этого. Я бы хотел сделать это без PHP, тем более, что это похоже на проблему, которая должна быть полностью разрешима с Apache. – JAL

Смежные вопросы