簡體   English   中英

帶有短URL的文件以原始文件名下載

[英]File with a short URL downloaded with original filename

問題( 請參閱下面的更長的解釋和我已經嘗試過的東西 ):

有沒有一種方法可以將簡短的URL http://example.com/qf56p9z重定向到/files/qf56p9z_(.*)格式的服務器上找到的第一個文件,並以文件名= (.*) (如果可能,沒有PHP)


背景 :

我在服務器上有一個文件,該文件存儲在/files/qf56p9z_blahblah.xls ,我希望可以通過以下簡短網址進行訪問:

http://example.com/qf56p9z

(+對於其他數千個文件相同)

此外,我希望當用戶轉到該URL時,該文件將以原始文件名 blahblah.xls下載到客戶端計算機上。

我嘗試使用PHP來做到這一點(對於我的數千個文件,可以很容易地實現自動化):

<?php
header('Content-type: ...');
header('Content-Disposition: attachment; filename="blahblah.xls"');
readfile('qf56p9z_blahblah.xls');
?>

但是我看到這種方法有兩個問題:

  • 客戶端每次讀取文件時,PHP都必須將整個文件加載到內存中,然后輸出新文件。 這比apache僅發送文件而不使用PHP的情況要消耗更多的CPU /內存。

  • 如果有一天我將所有這些文件托管在其他地方(例如在Amazon S3上),則該文件將必須執行以下路線:

    Distant-Hosting (AmazonS3) ==> my server/header modified with PHP ==> client

    可惜的是,數據必須這樣做,而不是:

    Distant-Hosting (AmazonS3) ==> client

您可以結合使用PHP.htaccess使用mod_rewrite

網站結構

  • /var/www/html/files/ :包含{prefix}_{filename}格式文件的目錄
  • /var/www/html/download.php腳本以給定前綴查找第一個文件
  • /var/www/html/.htaccess :具有2個用於重寫下載URL的mod_rewrite規則

download.php

<?PHP

$files_dir = "files/";

if(isset($_GET['prefix'])){
    $files = glob($files_dir.$_GET['prefix']."_*");
    if(count($files) > 0) {
        $dl = strlen($files_dir);
        $pl = strlen($_GET['prefix']);
        $fn = substr($files[0], $dl+$pl+1);
        header("Location: d/".$_GET['prefix']."/".$fn);
    }
}

?>

這將選擇具有所需前綴的第一個文件並重定向到該文件。

.htaccess

RewriteEngine On
RewriteRule ^(\w+)$     download.php?prefix=$1 [L]
RewriteRule ^d/(.+)/(.+)$   files/$1_$2 [L]

第一條規則將短URL重寫為download.php,第二條規則將URL重寫為原始文件位置。

這是這樣的

  1. http://example.com/qf56p9z - 的.htaccess - > http://example.com/download.php?prefix=qf56p9z
  2. download.php- PHP重定向 -> http://example.com/d/qf56p9z/blahblah.xls
  3. http://example.com/d/qf56p9z/blahblah.xls - 的.htaccess - > http://example.com/files/qf56p9z_blahblah.xls

在上述所有步驟中,瀏覽器的位置欄URL保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM