在IE中通过Iframe传递参数的问题

时间:2009-07-23 17:01:14

标签: iframe get cross-browser http-get

我正在尝试从我的网站执行HTTP GET到另一个通过iframe引入的网站。

在Firefox上,你可以在源代码中看到iframe src中的正确url及其正确的参数 - 并且它可以正常工作。

在IE上,您可以在源代码中看到iframe src中的正确url及其正确的参数 - 并且它不起作用...

是否有一些关于IE的内容不允许您通过查询字符串中的iframe传递参数?

我尝试在IE中刷新iframe,我尝试刷新了我的页面& IE中的iframe,我已经尝试复制url并将其重新粘贴到iframe src中(强制它刷新,好像我刚刚将其输入到iframe窗口的地址栏中)。仍然没有运气!

任何人都知道为什么会这样,或者有任何建议试图解决这个问题?

修改:我无法提供此链接,因为该网站需要我们网站和供应商网站的密码和登录凭据。即使我可以在我们的网站上建立一个测试帐户,但它对测试过程没有任何好处,因为我不能对供应商网站做同样的事情。至于代码,它所做的就是从页面加载的后端代码创建 src 并从后端设置src属性...

//Backend code to set src
mainIframe.Attributes["src"] = srcWeJustCreated;

//Front end iframe code
<iframe id="mainIframe" runat="server" />

编辑: 问题从未解决过。回答自动接受,因为赏金已过期。当我们的网站即将上线时,我会再次询问此问题,并提供更多信息和页面链接。


谢谢,
马特

6 个答案:

答案 0 :(得分:8)

通过IE中的默认安全设置,查询参数在Iframe中被阻止。在Internet选项下的安全选项卡上,将安全级别设置为低。如果这可以解决您的问题,那么您就知道这是您的问题。如果该网站是针对外部客户的,那么期望他们拒绝安全设置可能是不合理的,因此您可能需要找到解决方法。

答案 1 :(得分:1)

假设您的网站 www.acme.com ,iframe来源位于 www.myvendor.com

IIRC,大多数域级安全设置都不关心主机名,因此请在 myvendor.acme.com 的区域文件中添加DNS CNAME,并指向 www。 myvendor.com 即可。然后,在您的IFRAME中,使用您的主机名别名设置源。

另一个解决方案可能是让您的Javascript将src设置为您自己的服务器上的重定向器脚本(因此,在您的域中)。然后,您的脚本只需将IFRAME重定向到具有相同参数的“正确”URL。

答案 2 :(得分:0)

根据Mike的回答,您的案例中最简单的解决方案是使用“参数隐藏”将所有GET参数转换为单个URL。

最具扩展性的方式是URL中的每个“文件夹”由参数组成,然后是逗号,然后是值。例如,您可以在应用中使用这些网址:

  

http://example.com/app/param,value/otherparam,othervalue   http://example.com/app/param,value/thirdparam,value3

这相当于以下几点:

  

http://example.com/app?param=value&otherparam=othervalue   http://example.com/app?param=value&thirdparam=value3

对于使用.htaccess的Apache来说,这很容易,但看起来你正在使用IIS,所以我会留给你研究确切的实现。

编辑:刚刚回到这里并意识到如果您不拥有它,就不可能在不同的域上实现上述内容:p但是,您可以像这样在服务器端执行:< / p>
  • 在您自己的服务器上将上述参数隐藏设置为特殊脚本(如果IE不介意来自同一服务器的GET,则可能没有必要)。
  • 在Javascript中,根据各种参数构建静态URL。
  • 让服务器上的脚本使用参数并读取外部URL并输出它,即获取内容服务器端。 This question可以帮助您。

因此,您的iframe网址为:

  

http://yoursite.com/app/param,value/otherparam,othervalue

该页面将读取并显示URL:

  

http://externalsite.com/app?param=value&otherparam=othervalue

答案 3 :(得分:0)

如果它适合您,您可以在具有片段标识符的站点之间进行通信。你可以在这里找到一篇文章:http://tagneto.blogspot.com/2006/06/cross-domain-frame-communication-with.html

答案 4 :(得分:0)

BYK说的是什么。我认为发生的事情是你正在获取一个太大而不能让IE处理的URL。我注意到你正在尝试发送名为src的变量,这可能很长,超过4k。我之前遇到过这个问题,这是我的代码。注意关于IE的评论。还要注意它会导致Firefox出现问题,这可以在另一条评论中解决。

var autoSaveFrame = window.frames['autosave'];
// try to create a temp form object to submit via post, as sending the browser to a very very long URL causes problems for the server and in IE with GET requests.
var host = document.location.host;
var protocol = document.location.protocol;
// Create a form
var f = autoSaveFrame.document.createElement("form");
// Add it to the document body
autoSaveFrame.document.body.appendChild(f);
// Add action and method attributes
f.action = protocol + '//' + host + "/autosave.php"; // firefox requires a COMPLETE url for some reason! Less a cryptic error results!
f.method = "POST"
var postInput = autoSaveFrame.document.createElement('input');
postInput.type = 'text'
postInput.name = 'post';    
postInput.value = post;
f.appendChild(postInput);
//alert(f.elements['post'].value.length);
// Call the form's submit method
f.submit();

答案 5 :(得分:-1)

尝试使用间接方法。创建一个FORM。将其action参数设置为要导航的基本URL。将其方法设置为POST。将其目标设置为iframe,然后将必要参数创建为隐藏输入。最后,提交表格。它应该工作,因为它适用于POST。