我正在做一个简单的jQuery帖子:
$.post( "script.php", { urls: listOfURLs} );
post
工作正常,如果它不包含URL,但是,如果包含URL,那么我得到:
POST script.php 403 (Forbidden)
有没有什么方法可以清理这个URL列表或什么东西来防止它403ing?
所涉及的一切都在同一个域上。
据我所知:这个“bug”在服务器端。
作为第二个参数传递给$.post()
方法的对象被简单地序列化为请求中的数据。
您可以通过检查浏览器的Web控制台(例如:Firebug的“Net”选项卡,Firefox的内置控制台的“Network”选项卡或Chrome或IE中的类似选项卡)来查看发送到服务器的内容。我的猜测是您的请求与您提供的数据一起正确发送。
您的服务器对此数据的处理方式是另一回事;您需要调试服务器配置和服务器端代码,以确定您的请求最终如何触发403
。
403
的一个可能原因是错误的文件权限。检查您的文件权限是否允许Web服务器访问它们。
例如,如果您使用标准的apache / linux配置,请检查是否:
www-data
对所有代码目录都有x
权限www-data
对所有代码文件都有r
权限www-data
对应下载或上传的文件具有正确的权限它完全取决于你的listOfURLs
是什么,你只需要记住,post请求的数据部分应该始终是一个字符串,所以解决方案可能是:
json
字符串。json
。如果这不起作用,请向我们提供有关数据本身的一些其他详细信息
尝试url编码列表中的URL,然后传递给它
var encodedUrl = encodeURIComponent(url);
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
发回。
您使用Nginx作为您的Web服务器吗? Nginx不支持这样的帖子请求;您可以通过在服务器下的配置中添加以下内容来解决此限制。
error_page 405 =200 $request_uri;
真正发生的是Nginx正在生成HTTP响应405,然后尝试访问HTTP 405的错误文档,并在显示的内容上获得403。
您的代码中存在错误。你应该替换这个:
$.post( "script.php", { urls: listOfURLs} );
有了这个
$.post( "script.php", { 'urls[]': listOfURLs} );
因为listOfURLs
是一个javascript数组。这可以解释为什么如果URL列表为空,您的代码可以正常工作。
请参阅post()
文档页面上的第3个示例:jQuery.post() |jQuery API
如果这没有用,我会尝试使用Fiddler2仔细查看代码在发布帖子时所做的调用。该程序将显示被调用的URL和发布的数据。它对于调试此类问题非常有用。
你只需附加一些额外的字符串就可以添加你的网址
listURL = "data_url:"+listURL+"";
并将此数据传递给ajax。所以你得到的网址数据没有403禁止错误