curl Amazon CloudSearch在文档上传时抛出HTTP 403

4szc88ey  于 2023-10-19  发布在  其他
关注(0)|答案(6)|浏览(113)

我正在尝试将Amazon CloudSearch集成到SilverStripe中。我想做的是,当页面发布时,我想要一个CURL请求将页面数据作为JSON字符串发送到搜索云。
我使用http://docs.aws.amazon.com/cloudsearch/latest/developerguide/uploading-data.html#uploading-data-api作为参考。
每次我尝试上传它都会返回403。我已经允许IP地址在访问策略的搜索域以及。
我使用它作为代码参考:https://github.com/markwilson/AwsCloudSearchPhp
我认为问题是AWS没有正确认证。我如何正确验证它?

0mkxixxg

0mkxixxg1#

如果您收到以下错误
403 Forbidden,请求被管理规则禁止。
如果你确定你有适当的规则生效,我会检查你正在使用的API URL。确保您使用的是正确的端点。如果您正在进行批量上载,则API端点应如下所示

your-search-doc-endpoint/2013-01-01/documents/batch

注意2013-01-01,这是URL的必需部分。这是您将使用的API版本。您不能执行以下操作,即使它可能有意义

your-search-doc-endpoint/documents/batch<-不工作

要搜索,您需要点击以下API

your-search-endpoint/2013-01-01/search?您的搜索参数

k7fdbhmy

k7fdbhmy2#

经过多次搜索和反复试验,我能够把一个小的代码块放在一起,从各地的小片段代码,能够上传一个“文件”使用CURL和PHP到AWS cloudsearch。
最重要的一件事是确保您的数据以JSON格式正确发送。
注意:对于cloudsearch,你上传的不是文件,而是JSON数据流。这就是为什么我们中的许多人在上传数据时遇到问题。
因此,在我的情况下,我希望能够上传数据,我的搜索引擎在clousearch上,这似乎很简单,但缺乏示例代码来做到这一点,大多数人告诉你去文档,通常有例子,但使用aws CLI。php SDK只是一个学习的工具,而不是让它变得简单,你做20个步骤来完成一个任务,不仅你需要拥有所有这些其他的库,这些库只是原生PHP函数的 Package 器,有时不是让它变得简单,而是变得复杂。
回到我是如何做到这一点的,首先我从数据库中提取数据作为一个数组,并将其序列化以保存到一个文件中。

$row = $database_data;

foreach ($rows as $key => $row) {
  $data['type'] = 'add';
  $data['id'] = $row->id;           
  $data['fields']['title'] = $row->title;
  $data['fields']['content'] = $row->content;
  $data2[] = $data;
}

// now save your data to a file and make sure
// to serialize() it
$fp = fopen($path_to_file, $mode)
flock($fp, LOCK_EX);
fwrite($fp, serialize($data2));
flock($fp, LOCK_UN);
fclose($fp);

现在你有你的数据保存我们可以玩它

$aws_doc_endpoint = '{Your AWS CloudSearch Document Endpoint URL}';

// Lets read the data   
$data = file_get_contents($path_to_file);
// Now lets unserialize() it and encoded in JSON format
$data = json_encode(unserialize($data));

// finally lets use CURL    
$ch   = curl_init($aws_doc_endpoint);

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Length: ' . strlen($data)));
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);

$response = curl_exec($ch);
curl_close($ch);

$response = json_decode($response);

if ($response->status == 'success')
{
    return TRUE;
}
return FALSE;

就像我说的,没有什么。我遇到的大多数答案,使用Guzzle它真的很容易,是的,但对于像这样的简单任务,你不需要它。
除此之外,如果你仍然得到一个错误,请确保检查以下内容。
格式良好的JSON数据确保您有权访问端点。
我希望有人发现这个代码有帮助。

3duebb1j

3duebb1j3#

要诊断这是否是访问策略问题,您是否尝试过允许所有人访问上载的策略?下面这样的东西打开了它的一切:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "*"
      },
      "Action": "cloudsearch:*"
    }
  ]
}

我注意到,如果你只是在浏览器中访问文档上传端点(我的看起来像“doc-YOURDOMAIN-RANDOMID.REGION.cloudsearch.amazonaws.com“),你会得到403“管理规则禁止的请求”错误,即使是开放访问,所以as @dminer said你需要确保你发布到正确的完整网址。

**您是否考虑过使用PHP SDK?**类似http://docs.aws.amazon.com/aws-sdk-php/guide/latest/service-cloudsearchdomain.html。它应该负责发出正确的请求,在这种情况下,您可以排除传输错误。

nwnhqdif

nwnhqdif4#

这对我从来都不管用我用云搜索终端上传文件和php curl来搜索文件。

hgc7kmma

hgc7kmma5#

尝试将“cloudsearch:document”添加到CloudSearch的访问策略中的“操作”下

pbossiut

pbossiut6#

我在403 Forbidden, Request forbidden by administrative rules上遇到了同样的问题。这完全是由于使用文档结束点并添加API版本,如下所示。
在向Cloud Search中插入数据时,这一部分非常重要:
由于您正在尝试将数据插入到Cloud Search中,因此需要使用AWS提供的Cloud Search的文档端点。
需要后面跟着API版本,如下所示:

https://doc-xxxxx.zzzz.cloudsearch.amazonaws.com/2013-01-01/documents/batch

同时要注意添加内容类型,否则最终可能会得到HTTP 415 Unsupported Media Type错误。

addRequestHeader("Content-Type", "application/xml");

相关问题