使用Squid3代理时,POST绝对URI由XmlHttpRequest发送到服务器

Cro*_*oll 18 javascript xmlhttprequest squid google-chrome-extension

我现在遇到了一个奇怪的问题,即我正在开发的Chrome扩展程序发送http请求(普通的JavaScript).这是一个带有XmlHttpRequest(from )的POST请求,其中包含以下URL:background.js

http://host.com/postform/upload
Run Code Online (Sandbox Code Playgroud)

我也从普通网页(不是chrome扩展名)发送此请求,重要的是,如果我打开开发人员工具并检查我的请求的网络选项卡(选择原始标题显示),我会看到第一个标题:

POST /postform/upload HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

它在我启用代理而不是直接连接之前工作正常.我在我的Ubuntu上使用squid3.使用代理时请求之间只有一个不同之处 - 它使HTTP服务器返回404找不到 - 仅在使用代理时...

当我强制Chrome使用基于squid3的代理时(我在我的Chrome扩展程序中使用PAC脚本),我的请求将无效.我检查了很多次,尽我所能减少请求体的任何差异,而我现在剩下的就是第一个头.

在使用代理激活的请求发送时(从开发人员工具的网络选项卡,从后台页面打开),它看起来像这样:

POST http://host.com/postform/upload HTTP/1.1
Run Code Online (Sandbox Code Playgroud)

我尝试过使用chome.webRequest.onBeforeSendHeaders API,但这没有帮助.我还尝试从XmlHttpRequest.open中的 URL中删除主机名,但这没有帮助.

是的,我在任何情况下都会发送正确的Host和Origin标头.这可能是我的squid3配置中的问题,或者我应该在我的javaScript中更改什么?

UPDATE 现在意识到squid不是问题,问题是POST请求包含FULL uri(http:// ..)而不是"path".GET工作正常.这太痛苦了.

我不能使用iframe变通办法.我的问题是什么?

GLE*_*LES 4

要从 Chrome 扩展程序中使用API,您需要通过在清单属性XHR中指定目标主机的 URL 来请求目标主机的权限。"permissions"例如,如果目标主机(您想要向其发送请求XHR)是http://www.example.org,那么您的清单应包含以下代码行。

...
"permissions" : {
    "http://www.example.org",
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果您已经这样做了,那么显然错误出在后端部分。另请阅读有关匹配模式的信息,以允许使用单个字符串匹配多个 URL - 例如,*://www.example.org/*.