根据之前的回答和下方评论,您需要一个解决方案来隐藏图像解析器的真实路径,并给它一个固定的图像宽度。
步骤1:http://www.example.com/tn/full/animals/images/lion.jpg
您可以通过利用.htaccess
实现基本的“缩略图生成器”。
RewriteEngine on
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule tn/(full|small)/(.*) index.php?size=$1&img=$2 [QSA,L]
你的 PHP 文件:
$basedir = "/public/content/";
$filename = realpath($basedir.$_GET["img"]);
if ((!strncmp($filename, $basedir, strlen($basedir))
||(!file_exists($filename)) die("Bad file path");
switch ($_GET["size"]) {
case "full":
$width = 700;
$height = 500;
break;
default:
$width = 350;
$height = 250;
break;
}
这样可以使用URL www.example.com/tn/full/animals/images/lion.jpg
查看您缩小后的图像。
这对于SEO有优势,可以保留原始文件名。
步骤2:http://www.example.com/tn/full/lion.jpg
如果您想要更短的URL,并且图片数量不是太多,您可以使用文件的基本名称(例如“lion.jpg”)并进行递归搜索。当出现冲突时,请使用索引来标识您想要的内容(例如“1--lion.jpg”)。
function matching_files($filename, $base) {
$directory_iterator = new RecursiveDirectoryIterator($base);
$iterator = new RecursiveIteratorIterator($directory_iterator);
$regex_iterator = new RegexIterator($iterator, "#$filename\$#");
$regex_iterator->setFlags(RegexIterator::USE_KEY);
return array_map(create_function('$a', 'return $a->getpathName();'), iterator_to_array($regex_iterator, false));
}
function encode_name($filename) {
$files = matching_files(basename($filename), realpath('public/content'));
$tot = count($files);
if (!$tot)
return NULL;
if ($tot == 1)
return $filename;
return "/tn/full/" . array_search(realpath($filename), $files) . "--" . basename($filename);
}
function decode_name($filename) {
$i = 0;
if (preg_match("#^([0-9]+)--(.*)#", $filename, $out)) {
$i = $out[1];
$filename = $out[2];
}
$files = matching_files($filename, realpath('public/content'));
return $files ? $files[$i] : NULL;
}
echo $name = encode_name("gallery/animals/images/lion.jpg").PHP_EOL;
echo decode_name(basename($name)).PHP_EOL;
原帖:
基本上,如果在你的示例中添加一些格式,你的缩短URL实际上会更长:
img=/dir/dir/hi-res-img.jpg&w=700&h=500 // 39 characters
y8xNt9VPySwC44xM3aLUYt3M3HS9rIJ0tXJbcwMDtQxbUwMDAA // 50 characters
使用
base64_encode
总是会导致更长的字符串。而
gzcompress
至少需要存储一个不同字符的出现次数;这对于短字符串来说并不是一个好的解决方案。
因此,如果你想缩短你之前得到的结果,那么什么也不做(或仅使用一个简单的
str_rot13
)显然是首选考虑的选项。
你也可以使用一个简单的字符替换方法来完成:
$raw_query_string = 'img=/dir/dir/hi-res-img.jpg&w=700&h=500';
$from = "0123456789abcdefghijklmnopqrstuvwxyz&=/ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// The following line if the result of str_shuffle($from)
$to = "0IQFwAKU1JT8BM5npNEdi/DvZmXuflPVYChyrL4R7xc&SoG3Hq6ks=e9jW2abtOzg";
echo strtr($raw_query_string, $from, $to) . "\n";
// Result: EDpL4MEu4MEu4NE-u5f-EDp.dmprYLU00rNLA00 // 39 characters
根据您的评论,您真正想要“防止任何人获取高分辨率图像”。
最好的方法是使用私钥生成校验和。
编码:
$secret = "ujoo4Dae";
$raw_query_string = 'img=/dir/dir/hi-res-img.jpg&w=700&h=500';
$encoded_query_string = $raw_query_string . "&k=" . hash("crc32", $raw_query_string . $secret);
结果:img=/dir/dir/hi-res-img.jpg&w=700&h=500&k=2ae31804
解码:
if (preg_match("#(.*)&k=([^=]*)$#", $encoded_query_string, $out)
&& (hash("crc32", $out[1].$secret) == $out[2])) {
$decoded_query_string = $out[1];
}
这并不隐藏原始路径,但是该路径没有必要公开。一旦检查过密钥,您的 "index.php" 可以从本地目录输出图像。
如果您真的想缩短原始 URL,则必须考虑限制原始 URL 中可接受的字符。许多压缩方法基于您可以使用一个完整字节来存储多个字符的事实。