3

I am doing a simple jQuery post:

$.post( "script.php", { urls: listOfURLs} );

The post works fine if it contains no URLs, however, if there are URLs included, then I get:

POST script.php 403 (Forbidden)

Is there some way I can sanitize this list of URLs or something to prevent it from 403ing?

Everything involved is on the same domain.

4

7 回答 7

3

这完全取决于你listOfURLs是什么,你只需要记住,发布请求的数据部分应该始终是一个字符串,所以解决方案可能是:

  • 如果 ListOfURLs 是一个数组,你应该这样做:

    $.post( "script.php", { 'urls[]': [ "URL1", "URL2" ] } );

  • 如果是表单数据,可以序列化为json字符串。

  • 如果不是任何一个,试着让它json像。

如果这不起作用,请向我们提供有关数据本身的一些其他详细信息

于 2013-10-07T10:21:11.130 回答
3

据我所知:这个“错误”在服务器端。

作为方法的第二个参数传递的对象$.post()在您的请求中被简单地序列化为数据。

您可以通过检查浏览器的 Web 控制台(例如:Firebug 的“网络”选项卡,或 Firefox 内置控制台的“网络”选项卡,或 Chrome 或 IE 中的类似选项卡)来查看发送到服务器的内容。我的猜测是您的请求与您提供的数据一起正确发送。

您的服务器如何处理这些数据是另一回事;您将需要调试您的服务器配置和服务器端代码,以确定您的请求最终如何触发403.

一个可能的原因403是错误的文件权限。检查您的文件权限是否允许 Web 服务器访问它们。

例如,如果您使用标准的 apache/linux 配置,请检查:

  • 用户www-data拥有x所有代码目录的权限
  • 用户www-data拥有r所有代码文件的权限
  • 用户www-data对应该下载或上传的文件拥有正确的权限
  • 您的站点配置文件会删除某些目录的访问权限
  • 您的 .htaccess 文件从某些目录中删除访问权限
  • ETC ...
于 2013-10-08T15:31:53.883 回答
1

尝试对列表中的 URL 进行 url 编码,然后传递给它

var encodedUrl = encodeURIComponent(url);
于 2013-10-08T04:59:39.633 回答
1

403 告诉您系统尝试使用您尝试发送的对象访问 URL 或资源。

我不喜欢这个 ajax 调用的简短形式。如果您喜欢代码中的更多概述,请使用JQuery 的长语法。有关更多信息,请参阅此。

$.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);

然后您可以将对象作为字符串接收并使用 php 函数,例如json_decode将数据作为变量检索,做任何您想做的事情并通过json_encode.

于 2013-10-07T22:06:38.103 回答
0

您的代码中有错误。你应该替换这个:

$.post( "script.php", { urls: listOfURLs} );

有了这个

$.post( "script.php", { 'urls[]': listOfURLs} );

因为listOfURLs是一个 javascript数组。这可以解释为什么如果 URL 列表为空,您的代码会起作用。

post()请参阅文档页面上的第三个示例: jQuery.post() |jQuery API

如果这没有帮助,我会尝试使用Fiddler2仔细查看您的代码在发布时所做的调用。该程序将向您显示正在调用的 URL 和正在发布的数据。这对于调试此类问题非常有用。

于 2013-10-12T20:22:16.080 回答
0

您是否使用 Nginx 作为您的 Web 服务器?Nginx 不支持这样的 post 请求;您可以通过将以下内容添加到服务器下的配置来解决此限制。

    error_page 405 =200 $request_uri;

真正发生的是 Nginx 正在生成 HTTP 响应 405,然后尝试访问 HTTP 405 的错误文档并在显示的内容上获得 403。

于 2013-10-12T20:35:55.337 回答
0

你只需在你的 url 上附加一些额外的字符串,比如

listURL = "data_url:"+listURL+"";

并将这些数据传递给ajax。所以你得到没有 403 禁止错误的 url 数据

于 2018-09-17T10:40:56.767 回答