Mod_rewriting 将查询字符串写入 swf 文件

Posted

技术标签:

【中文标题】Mod_rewriting 将查询字符串写入 swf 文件【英文标题】:Mod_rewriting a query string onto a swf file 【发布时间】:2011-01-11 20:23:09 【问题描述】:

我正在尝试使用 mod_rewrite 来清理 Flash 视频播放器的 URL。首先,这是我试图重写的原始 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 发送查询字符串?

【问题讨论】:

【参考方案1】:

等等,我相信你可以,但你必须编写解析这些参数所必需的 ActionScript,例如,看看我为一家知名公司所做的一些旧工作的示例:

不要轻易让 FLA 立即出现在我面前,但也许我的例子会帮助你阐明你的决心。因此,是的,您可以从 flash 中动态解析变量,但我相信它必须有某个地方将这些变量写入您的硬 cookie 以跟踪这些变量,因此无法即时保存这些信息。也许通过一些服务器配置和闪存重写,理论上你可以做你想做的事。

无论如何,也许可以编写一个 PHP 文件,它是您的动态 flash 的联络点,用于在加载时在您的 flash 电影上推送/浮动/强制变量,或者简单地使用 js 回调到 dom 以根据如何重写您的 flash您的反馈来自 dom。如果您跳出框框思考,有很多方法可以解决问题。随意查看 SWF,只是不要重复使用它,它显然仅用于示例目的......

示例:http://www.louierd.com/soe/itemsdetails/

现在在这个例子中,我使用 flash 的唯一目的是调整显示外部 html 所需的高度,这样做是为了有一个跨浏览器的可靠方法来有效地跨平台和浏览器获得正确的大小。几乎没有人支持使用纯 javascript 来做到这一点,而不必从头开始编写冗长的 javascript,没有时间,所以我选择了 flash,因为当时我为该公司工作的大多数其他项目几乎都是 flash以某种方式进行项目。

【讨论】:

【参考方案2】:

我对 Workmad3 的答案投了赞成票,但我也想继续发布这个替代解决方案。对于我的重写规则,我使用了与我在原始问题中发布的类似规则。

RewriteRule ^player/(.+)$ library/player.swf [L]

然后在actionscript中,做类似这样的事情:

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,但你可以让它工作。

【讨论】:

【参考方案3】:

如果您将 [R] 添加到指令标志,它将执行客户端应该看到的外部重定向。

【讨论】:

但是 URL 根本没有被清理。它和往常一样丑陋的 URL,重定向没有意义......【参考方案4】:

使用您正在尝试的机制是不可能的。请记住,.swf 是在客户端处理的,因此服务器所做的只是将文件发送到客户端。查询字符串与此无关,服务器基本上会忽略它。

可以读取 .swf 文件中的查询字符串参数,但同样不能使用直接提供的文件。这又是由于这些东西是如何工作的......要访问参数,.swf 需要嵌入到 DOM 中,然后它将能够访问 DOM 并通过 DOM 接口获取查询字符串,所以将是作为 html 页面的一部分。

如果有帮助的话,我经常看到将参数放入 .swf 文件的一种方法是使用 PHP 脚本动态创建标签并以这种方式设置参数,对应于查询字符串参数、数据库变量等。然后提供整个页面,并在 Flash 运行时运行 .swf 应用程序时将参数传递给它。

【讨论】:

Swf 文件不一定必须包含在 HTML 中才能访问查询字符串参数。我在 Flex 中使用 Application.application.parameters 对象,它工作得很好,即使没有 HTML 包装器。我所要做的就是将我的浏览器指向 player.swf?path=whatever.flv,一切都按预期加载。也就是说,我想我同意你的第一段。关于 mod_rewrite 是服务器端而 swf 是客户端的一些东西导致我的参数永远不会被传递。 啊,我猜浏览器会创建某种形式的 DOM 供 Flash 播放器访问,即使没有一些 HTML 包装它:) 好的,这很有道理。 Webkit 的检查器确实显示了一个简单的 html 正文结构被自动抛出。

以上是关于Mod_rewriting 将查询字符串写入 swf 文件的主要内容,如果未能解决你的问题,请参考以下文章

C#写入追加数据

c# StreamWriter 应用中,我想每一行中写入两个不同性质的数据,该怎么写呢

ElasticsearchES 7.8 写入 查询 Normalizer 忽略 大小写

python 连接数据库,查询结果写入数据到excel

访问 sql 查询以连接行

如何在shell 中将sql语句执行结果写入日志中