我可以在与从该端口加载的脚本文件不同的端口上使用 XMLHttpRequest 吗?

Posted

技术标签:

【中文标题】我可以在与从该端口加载的脚本文件不同的端口上使用 XMLHttpRequest 吗?【英文标题】:Can I use XMLHttpRequest on a different port from a script file loaded from that port? 【发布时间】:2010-12-18 13:19:27 【问题描述】:

我有使用 XMLHttpRequest(实际上是 jQuery)的网站。我还有另一个站点在同一台服务器上运行,它提供一个脚本文件,将 XHR 请求返回到那个站点,即。

http://mysite:50000/index.html 包括

<script src="http://mysite:9000/otherscript.js"></script>

http://mysite:9000/otherscript.js包括

$.ajax(
    url: 'http://mysite:9000/ajax/stuff'
);

问题是 - 这不起作用。来自加载脚本的 AJAX 请求只是失败,没有错误消息。据我所知,这是旧的同源政策。鉴于我控制了这两个站点,我能做些什么来完成这项工作吗? “document.domain”技巧似乎对 XMLHttpRequest 没有任何作用。

【问题讨论】:

请求实际上是发出的,“只是”你的源在没有启用CORS 的情况下无法读取响应。 Cross-origin writes are typically allowed. 【参考方案1】:

您可以通过添加Access-Control-Allow-Origin 标头来做到这一点。

如果你使用的是 php

header("Access-Control-Allow-Origin: http://example.com");

或在 Node.js 中

response.writeHead(200, 'Access-Control-Allow-Origin':' http://example.com');

这应该可以为您解决问题。它总是对我有用。

【讨论】:

【参考方案2】:

我刚刚通过制作单行代理 PHP 页面 SimpleProxy.php 解决了与我目前正在使用的 PHP 服务的类似问题(不确定 PHP 解决方案与此直接相关程度如何,但是...) :

<?php
echo file_get_contents('http://localhost:4567');
?>

在我的 XMLHttpRequest 中,我使用“SimpleProxy.php”代替“http://localhost:4567”,这有效地将请求放在与我的 .js 代码相同的域中。

【讨论】:

【参考方案3】:

不——不能用 XHR 做到这一点。同域策略非常严格——相同的主机、相同的端口、相同的协议。对不起!您必须借助其他技巧(iframe、标题操作等)才能使其正常工作。

【讨论】:

如果你已经签署了javascript,你可以在FF上这样做。 参见dannythorpe.com/2008/07/28/… 和orensol.com/2009/06/07/… 示例。有 jQuery 和 dojo 插件可以很好地包装这些东西。 这是一个 jQuery 插件,我已经看到了其他几个插件,但现在不能动手:friedcellcollective.net/outbreak/jsjquerywindownameplugin window.name 插件看起来很有前途,但不幸的是它也无法工作。 :( 因为你控制了两个站点,你也可以做 JSONP(见ibm.com/developerworks/library/wa-aj-jsonp1/…)。 jQuery 本身就支持这一点——你只需要让服务器吐出 JSONP(你没有指定你的服务器技术)。

以上是关于我可以在与从该端口加载的脚本文件不同的端口上使用 XMLHttpRequest 吗?的主要内容,如果未能解决你的问题,请参考以下文章

docker 在不同的端口上运行 mongo 映像

我们可以让 Spring Boot jar + Next Js 在与打包 Jar 相同的端口上运行吗

从 QT Creator 加载构建的 exe 与从文件系统加载 exe 不同吗? [网络套件问题]

Python串行端口在传输中省略字符

加载wordpress时xampp切换到localhost

CORS 允许所有在同一服务器上的不同端口在 JAVA 中