POST Absolute URI 在使用 Squid3 代理时由 XmlHttpRequest 发送到服务器

Posted

技术标签:

【中文标题】POST Absolute URI 在使用 Squid3 代理时由 XmlHttpRequest 发送到服务器【英文标题】:POST Absolute URI is sent to server by XmlHttpRequest when using Squid3 proxy 【发布时间】:2016-05-02 11:16:36 【问题描述】:

我现在从我正在开发的 Chrome 扩展程序(普通 javascript)发送 http 请求时遇到了奇怪的问题。这是一个带有 XmlHttpRequest(来自 background.js)的 POST 请求,其 url 如下:

http://host.com/postform/upload

我也从普通网页(不是 chrome 扩展)发送这个请求,重要的一点是如果我打开开发者工具并检查我的请求的网络选项卡(选择 raw 标题显示)我在那里看到第一个标题:

POST /postform/upload HTTP/1.1

在我启用代理而不是直接连接之前它工作正常。为此,我在我的 Ubuntu 上使用 squid3。使用代理时请求之间只有一件事不同 - 它使 HTTP 服务器返回 404 not found - 仅在使用代理时..

当我强制 Chrome 使用基于 squid3 的代理时(我在我的 chrome 扩展程序中使用 PAC 脚本),我的请求将不起作用。我检查了很多次,并尽我所能减少请求正文中的任何差异,而我现在只剩下第一个标头。

在代理激活的情况下发送请求时看起来像这样(从开发者工具的网络选项卡,从背景页面打开):

POST http://host.com/postform/upload HTTP/1.1

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

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

更新 现在意识到 squid 无论如何都不是问题,问题在于 POST 请求包含完整的 uri (http://...) 而不是“路径”。 GET 工作正常。快要死了。

我无法使用iframe 解决方法。我有什么问题?

【问题讨论】:

我了解使用代理时导致服务器出现 404 错误的原因,但我不明白为什么如果请求是从普通 Chrome 网页 (jquery/ajax) 发送而不是扩展后端脚本。 【参考方案1】:

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

...
"permissions" : 
    "http://www.example.org",
    ...

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

【讨论】:

@DmitrjA 如果这是您所拥有的,那是格式错误的匹配模式。应该是"*://*/*" @Xan *://*.org 正是我所需要的。我尝试了您的解决方案,但没有任何改变。 GET 按预期工作,POST 失败,因为标头包含完整的请求 URI 而不是“位置”(路径)。

以上是关于POST Absolute URI 在使用 Squid3 代理时由 XmlHttpRequest 发送到服务器的主要内容,如果未能解决你的问题,请参考以下文章

带有反向代理后面的HTTPS的build_absolute_uri

浅析java.lang.IllegalArgumentException: URI is not absolute

hive启动时报错: Relative path in absolute URI: ${system:java.io.t

异常 The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved

maven使用jstl表达式和The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.

org.apache.jasper.JasperException: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be res