如果 URL 在数据中,POST 返回 403
Posted
技术标签:
【中文标题】如果 URL 在数据中,POST 返回 403【英文标题】:POST returns 403 if URL is in data 【发布时间】:2013-10-08 10:41:01 【问题描述】:我正在做一个简单的 jQuery 帖子:
$.post( "script.php", urls: listOfURLs );
post
如果不包含 URL,则可以正常工作,但是,如果包含 URL,则我得到:
POST script.php 403 (Forbidden)
有什么方法可以清理这个 URL 列表或防止它出现 403 错误吗?
所涉及的一切都在同一个域中。
【问题讨论】:
你的网站在线吗??? 给出您使用此代码的页面链接? 我宁愿不在开发阶段。 什么是 listOfURLs? @undefined 就像它的名字一样,是一个 URL 列表。它恰好是一个 javascript 数组,每个数组都包含一个 URL 字符串。 【参考方案1】:据我所知:这个“错误”在服务器端。
作为第二个参数传递给$.post()
方法的对象在您的请求中被简单地序列化为数据。
您可以通过查看浏览器的 Web 控制台(例如:Firebug 的“网络”选项卡,或 Firefox 内置控制台的“网络”选项卡,或 Chrome 或 IE 中的类似选项卡)查看发送到服务器的内容)。我的猜测是您的请求与您提供的数据一起正确发送。
您的服务器如何处理这些数据是另一回事;您将需要调试您的服务器配置和服务器端代码,以确定您的请求最终如何触发403
。
403
的一个可能原因是文件权限错误。检查您的文件权限是否允许 Web 服务器访问它们。
例如,如果您使用标准的 apache/linux 配置,请检查:
用户www-data
对所有代码目录拥有x
权限
用户www-data
对所有代码文件拥有r
权限
用户www-data
对应该下载或上传的文件拥有正确的权限
您的站点配置文件会删除某些目录的访问权限
您的 .htaccess 文件删除了某些目录的访问权限
等等...
【讨论】:
我想他说他只有在发送urls: listOfURLs
时才会得到403。
很抱歉错过了赏金窗口...这就是问题所在。我不知道,服务器上存在一些疯狂的安全问题,将我的 POST 标记为恶意并阻止它们。【参考方案2】:
这完全取决于您的listOfURLs
是什么,您只需要记住,发布请求的数据部分应该始终是一个字符串,因此解决方案可能是:
如果 ListOfURLs 是一个数组,你应该这样做:
$.post("script.php", 'urls[]': ["URL1", "URL2"] );
如果是表单数据,可以序列化为json
字符串。
如果没有,请尝试将其设为json
喜欢。
如果这不起作用,请向我们提供有关数据本身的一些其他详细信息
【讨论】:
【参考方案3】:尝试对列表中的 URL 进行 url 编码,然后传递给它
var encodedUrl = encodeURIComponent(url);
【讨论】:
【参考方案4】:403 告诉您系统尝试使用您尝试发送的对象访问 URL 或资源。
我不喜欢这种 ajax 调用的简短形式。如果您喜欢代码中的更多概述,请使用long syntax of JQuery。 See this for more information.
$.ajax(
type: "POST",
url: url,
data: listofURLs2JSON,
dataType: "json",
statusCode:
404: function()
alert( "List of urls. Nooooo" );
,
success: function(data)
alert( "This was totally awesome!" );
,
);
正如 Labib 指出的那样,您可以使用 JSON 来避免 403。要反序列化对象,请使用JSON.stringify:
var listofURLs2JSON = JSON.stringify(array/object, callback);
然后您可以将对象作为字符串接收并使用像json_decode
这样的php 函数将数据作为变量检索,做任何您想做的事情并通过json_encode
将其发送回。
【讨论】:
【参考方案5】:您是否使用 nginx 作为您的 Web 服务器? Nginx 不支持这样的 post 请求;您可以通过将以下内容添加到服务器下的配置来解决此限制。
error_page 405 =200 $request_uri;
真正发生的是 Nginx 正在生成 HTTP 响应 405,然后尝试访问 HTTP 405 的错误文档并在显示的内容上获得 403。
【讨论】:
【参考方案6】:您的代码中有错误。你应该替换这个:
$.post( "script.php", urls: listOfURLs );
有了这个
$.post( "script.php", 'urls[]': listOfURLs );
因为listOfURLs
是一个javascript 数组。这可以解释为什么如果 URL 列表为空,您的代码会起作用。
请参阅post()
文档页面上的第三个示例:jQuery.post() |jQuery API
如果这没有帮助,我会尝试使用 Fiddler2 仔细查看您的代码在发布时所做的调用。该程序将向您显示正在调用的 URL 和正在发布的数据。这对于调试这类问题非常有用。
【讨论】:
【参考方案7】:你只需在你的 url 后面加上一些额外的字符串,比如
listURL = "data_url:"+listURL+"";
并将这些数据传递给 ajax。这样你就可以得到没有 403 禁止错误的 url 数据
【讨论】:
以上是关于如果 URL 在数据中,POST 返回 403的主要内容,如果未能解决你的问题,请参考以下文章
$GET/$POST 中的 "+have+" 导致服务器返回 403 Forbidden
Angular http post 仅在 Chrome 中在服务器上返回 403 错误
Tomcat 启用 CORS:来自 Safari 的 POST 请求返回 200,Chrome 和 Firefox 返回 403