我有一个使用以下语法链接到歌曲的音乐播放器:
<li><a href="" data-src="http://s3.amazonaws.com/audiojs/02-juicy-r.mp3">title</a></li>
有没有办法让我执行服务器端,然后为用户显示(见下文)?
在搜索时,我遇到了这个...我喜欢有一个外部文件背后的想法,这个文件有数据......如:
<?php
// get-file.php
// call with: http://yoururl.com/path/get-file.php?id=1
$id = (isset($_GET["id"])) ? strval($_GET["id"]) : "1";
// lookup
$url[1] = 'link.mp3';
$url[2] = 'link2.mp3';
header("Location: $url[$id]");
exit;
?>
然后使用:http://yoururl.com/path/get-file.php?id=1作为链接...唯一的问题是,当您键入http://yoururl.com/path/get-file.php?id=1时,用户直接进入该文件...是否有任何方法可以禁用该功能.. .maybe get-file.php本身的一些代码?
答案 0 :(得分:5)
好的,所以我做了一些我很满意的事情......虽然不是很安全,但它确实让我模糊了不少。
首先,我使用AudioJS播放器播放音乐 - 可以找到:http://kolber.github.com/audiojs/
基本上我做的是:
所以,现在我的内联javascript看起来像:
<script type="text/javascript">
$(function() {
// Play entire album
var a = audiojs.createAll({
trackEnded: function() {
var next = $("ul li.playing").next();
if (!next.length) next = $("ul li").first();
next.addClass("playing").siblings().removeClass("playing");
audio.load($("a", next).attr("key") + "mp3");
audio.play();
}
});
// Load the first song
var audio = a[0];
first = $("ul a").attr("key") + "mp3";
$("ul li").first().addClass("playing");
audio.load(first);
// Load when clicked
$("ul li").click(function(e) {
e.preventDefault();
$(this).addClass("playing").siblings().removeClass("playing");
audio.load($('a', this).attr('key') + "mp3");
audio.play();
});
});
</script>
我的链接如下:
<a href="<?php $link = 'http://itunes.apple.com/us/album/falling/id504779876?i=504779883&uo=4'; $obfuscatedLink = ""; for ($i=0; $i<strlen($link); $i++){ $obfuscatedLink .= "&#" . ord($link[$i]) . ";"; } echo $obfuscatedLink; ?>" target="itunes_store" key="<?php $link = './8249795872/9273847591.'; $obfuscatedLink = ""; for ($i=0; $i<strlen($link); $i++){ $obfuscatedLink .= "&#" . ord($link[$i]) . ";"; } echo $obfuscatedLink; ?>">Falling</a>
当您在浏览器中加载它并查看源代码时,您会看到:
<a href="http://itunes.apple.com/us/album/falling/id504779876?i=504779883&uo=4" target="itunes_store" key="./8249795872/9273847591.">Falling</a>
然后,当您使用Web Inspector或Firebug时,您会看到:
<a href="http://itunes.apple.com/us/album/falling/id504779876?i=504779883&uo=4" target="itunes_store" key="./8249795872/9273847591.">Falling</a> - *which doesn't completely give the url away
基本上我所做的就是让链接看起来像是某种类型的api-key。很酷的是,您不能直接从视图源复制链接,也不能直接从Web Inspector / Firebug复制链接。它不是万无一失的,绝对可以被打破,但用户必须知道他们在做什么。它让大多数人远离,但仍然允许玩家获得播放歌曲所需的网址:)
*另外,我从Stack Exchange上的某处获得了php obfusticate脚本,只是不知道在哪里。
答案 1 :(得分:1)
不是进行标题重定向,而是添加适当的标题并在PHP代码中包含音频文件。然后,在.htaccess文件中,您可以禁止访问音频文件所在的目录。
答案 2 :(得分:0)
没有。这是不可能的,因为浏览器解释HTML以使页面正常工作。因此,如果客户端(浏览器)不知道mp3的来源,则无法使用。
另一方面,如果您想通过点击链接获得音乐切换歌曲,那么我建议您查看一些工具,例如http://jplayer.org/
编辑:可能阻止直接访问文件本身的唯一方法是读取文件,而不是从脚本链接到文件。例如,在我的图像托管网站http://www.tinyuploads.com/images/CVN5Qm.jpg上,如果您要查看我服务器上的实际文件路径,则文件CVN5Qm.jpg将不在public_html文件夹中。无法直接访问该文件。我使用数据库获取图像ID,查找存储位置,然后将readfile()写入脚本并显示正确的标题以输出图像。
希望这有帮助
答案 3 :(得分:0)
如果您使用的是amazon s3服务,则可以使用已签名的网址来存档。它将更安全,因为您必须是签名用户,并且URL也可以过期。阅读this。
答案 4 :(得分:0)
我使用http_referer,我可以控制链接的优先级
<?php
// key.php
// call with: http://yoururl.com/path/key.php?id=1
$page_refer=$_SERVER['HTTP_REFERER'];
if ($page_refer=="http://www.yourdomine.com/path/page.html")
{
$id = (isset($_GET["id"])) ? strval($_GET["id"]) : "1";
// lookup
$url[1] = 'link1.mp3';
$url[2] = 'link2.mp3';
header("Location: $url[$id]");
exit;
}
else
{
exit;
}
?>