我正在尝试使用mod_rewrite清除闪存视频播放器的URL。首先,这是我正在尝试重写的原始网址:
library/player.swf?path=path-to-file.flv
当我直接访问它时,上述URL工作正常。我编写了swf来自动获取路径参数并播放视频。没有问题。现在这是我尝试的重写规则:
RewriteRule ^player/(.+)$ library/player.swf?path=$1 [QSA,L]
访问url player / path-to-file.flv时,我得到了swf但没有加载视频。我在flash中设置了一个弹出窗口,告诉我用于调试目的的路径名,看起来路径根本没有被传递。
另一方面,如果我使用完全相同的规则但将其指向test.php而不是player.swf,则test.php文件能够回显参数。
所以问题归结为,我做错了什么或是不可能通过mod_rewrite将查询字符串发送到swf?
答案 0 :(得分:2)
使用你在那里尝试的机制是不可能的。请记住,.swf是在客户端处理的,因此所有服务器正在执行的是将文件发送到客户端。查询字符串与此无关,服务器基本上只是忽略它。
可以在.swf文件中读取查询字符串参数,但不能使用直接提供的文件。这又是由于这些东西如何工作......要访问参数,.swf需要嵌入到DOM中,然后它才能访问DOM并通过DOM接口获取查询字符串,因此将是作为HTML页面的一部分。
如果有任何帮助,我经常看到将参数放入.swf文件的方法是使用PHP脚本动态创建标签并以这种方式设置参数,对应于查询字符串参数,数据库变量然后提供整个页面,并且当flash运行时运行时,参数将传递到.swf应用程序。
答案 1 :(得分:1)
我投了Workmad3的答案,但我想继续发布这个替代解决方案。对于我的重写规则,我使用了与我在原始问题中发布的类似规则。
RewriteRule ^player/(.+)$ library/player.swf [L]
然后在动作脚本中,做一些类似的事情:
var url:String = String(ExternalInterface.call("function(){return document.location.pathname.toString();}"));
var urlParts:Array = url.split("/");
var length:Number = urlParts.length;
var file:String = urlParts[length-1] + ".f4v";
Alert.show("The filename is: " + file);
上面的内容只是在一个警告窗口中发布文件名,但关键是你理论上可以使用它来制作“干净”的网址。它感觉有点hackish,但你可以使它工作。
答案 2 :(得分:0)
如果在指令标志中添加[R],它将执行客户端应该看到的外部重定向。
答案 3 :(得分:0)
等等,我相信你可以,但是你必须编写解析这些参数所必需的ActionScript,例如,看看我为信誉良好的公司做的一些旧工作的例子:
不要轻易让FLA立即在我面前看,但也许我的例子可以帮助你明白你的决心。因此,是的,你可以动态地解析来自flash的变量,但我相信它必须有一些地方可以将这些变量写成你的硬cookie来跟踪这些变量,因此无法动态保存这些信息。也许有了一些服务器配置和闪存重写,理论上你可以做你想做的事。
无论如何,也许写一个PHP文件,这是你的动态flash用于在加载flash动画时推送/浮动/强制变量的liason,或者只是使用js回调到dom根据如何重写你的flash你的反馈来自dom。如果你在盒子外思考,有很多方法可以解决问题。随意查看SWF,只是不要重复使用它,它仅仅是为了示例目的......
示例:http://www.louierd.com/soe/itemsdetails/
现在在这个例子中,我使用flash只是为了调整显示外部HTML所需的高度,这样做是为了有一个跨浏览器的可靠方法来有效地跨平台和浏览器获得正确的大小。使用普通的javascript几乎没有支持这么做,而不必从头开始编写冗长的javascript,没有时间,所以我选择了闪存,因为当时为该公司工作的大多数其他项目都是闪存以某种方式进行项目。