3

画像のディレクトリがあり、ブラウザで直接表示したり、ダウンロードしたりできます。

/gallery/gal_4254.jpg というファイルがあるとします。

/download/gal_4254.jpg を作成して、画像を表示するのではなく、画像のダウンロードをトリガーしたいと考えています。/download は空です。すべての画像は /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 にヘッダーを持たせたくありません.

ただし、2つを組み合わせる必要があるため、リクエストは他のディレクトリのファイルにマップされ、ファイルには添付ヘッダーが与えられます。

#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を使用したソリューションも大歓迎です。

4

3 に答える 3

2

あなたの例に出くわした後、私はちょうどこれをしました;-)あなたはあなたの最新の例であなたの「ディレクトリ/ var / www/download」セクションを「場所/ダウンロード」に変更する必要があると確信しています。 。

理論的根拠は次のとおりです。「ディレクトリ」は、リライトが発生した後の結果の物理ディレクトリに適用されますが、「場所」は、物理ファイルを見つけるためにリライトが発生した場合でも、元のURIに適用されます。

mod_rewriteはさまざまな時点で適用される巨大なハックであるため、コードの効果はあまり明白ではありません。

私のworkjingセットアップにあるのは:

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

したがって、/ contents / e-docs/myimage.jpgは実際には/e-docs/ myimageですが、/ contents/myimage.jpgや/contents/e-docs/myimage.jpgなどのURLはどちらもContent-Dispositionヘッダーを取得します。書き直しが言うように、jpgファイル。

このためにPHPを回避すると、メモリを大量に消費するPHPバックエンドプロセスではなく、軽量の静的Apacheサーバーでこれらの画像や潜在的に巨大なビデオファイルを提供できるという追加の利点があります。

于 2010-07-08T16:11:06.070 に答える
1

組み合わせたソリューションは、次のセットアップになる可能性があります。最初にディレクトリ エントリを変更します。

<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 にリダイレクトされます。download.php は要求を処理し、名前を付けて保存ダイアログを強制的に表示します。

ポール

于 2010-03-02T17:21:51.730 に答える
1

シンプルなphpソリューション:

ダウンロード.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>
于 2010-03-02T17:24:10.900 に答える