Yeniden yazmak ve Apache aynı anda başlıklarını nasıl ayarlanır

3 Cevap php

Ben dönüşümlü doğrudan tarayıcıda izlendi, ve diğer zamanlarda indirilen görüntülerin bir dizin var.

Yani, bir dosya / gallery/gal_4254.jpg söylüyorlar.

I / download/gal_4254.jpg görüntünün bir indirme tetiklemek yapmak yerine onu görmek istiyorum. / Indirme boş, tüm images / galeri bulunmaktadır.

Ben başarıyla diğer dosyaların indirme dir isteklerini eşleyebilirler

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

ve ben zaten ayarlayarak galeri Dir indirme zorlayabilir

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

böylece üstbilgileri ayarlayarak sorun yok. Ben aslında sadece yeniden yazılır / download / vasıtasıyla / galeri / * talepleri olsa başlıkları var / galeri istemiyorum.

Ama ikisini birleştirmek gerekir, bu yüzden istek, diğer Dir dosyaya eşleştirilir ve dosya eki başlığını verilir.

#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>

Ben boşuna rewrite ve başlık bölümlerinin sırasını değiştirerek denedim. Ben isteği, diğer dizine yeniden yazılarak zaman başlığını kaybeder düşünüyorum.

Apache bunu yapmak konusunda herhangi bir öneriniz?

Ben Sunucu Fayı vs burada yayınlanan neden olan, bu aynı zamanda PHP ile yapılabilir biliyoruz. PHP kullanarak bir çözüm de hoş olurdu.

3 Cevap

Basit php çözüm:

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>

A combined solution could be the following setup. First change the directory entry:

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

Download.php böyle bir şey (test değil) içermelidir:

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

Bu da isteklerini işler ve görünmesini saveas diyaloğu zorlar download.php tüm indirme isteklerini yönlendirmek shouldd.

Paul

I just did this, after stumbling on your example ;-) I'm pretty sure you just have to change your "Directory /var/www/download" section to a "Location /download" in your latest example and you're OK.

Gerekçe şudur: "Konum" orijinal URI, herhangi bir yeniden yazılmasının fiziksel dosyayı bulmak için oluştu olan hiçbir madde için de geçerlidir, oysa "Dizin", yeniden yazılmasının oluştu SONRA, sonuçta fiziksel dizine uygulanır.

Mod_rewrite çeşitli zamanlarda geçerli bir dev kesmek gibi, kod etkisi çok belirgin değildir.

Ne benim workjing kurulum var ise:

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

Yani / içeriği / myImage.jpg VE / içindekiler / e-docs / myImage.jpg gibi URL'ler / içeriği / e-docs / myImage.jpg aslında / e-docs/myimage olsa bile, Content-Disposition başlığını olsun hem de. jpg dosyası, yeniden yazma diyor.

Bunun için PHP kaçınmak Eğer hafif bir statik Apache sunucu, bir bellek domuz PHP back-end süreci ile (benim durumumda olduğu gibi) bu görüntüleri ve potansiyel olarak büyük video dosyalarını hizmet edebilir yararı var.