[英]File with a short URL downloaded with original filename
問題( 請參閱下面的更長的解釋和我已經嘗試過的東西 ):
有沒有一種方法可以將簡短的URL http://example.com/qf56p9z重定向到/files/qf56p9z_(.*)
格式的服務器上找到的第一個文件,並以文件名= (.*)
? (如果可能,沒有PHP)
背景 :
我在服務器上有一個文件,該文件存儲在/files/qf56p9z_blahblah.xls
,我希望可以通過以下簡短網址進行訪問:
(+對於其他數千個文件相同)
此外,我希望當用戶轉到該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重寫為原始文件位置。
這是這樣的
在上述所有步驟中,瀏覽器的位置欄URL保持不變。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.