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