使用/ update-cache请求更新AMP页面

时间:2017-07-18 07:41:34

标签: php amp-html

尝试使用/ update-cache / requests更新一些AMP页面,但我收到403错误。

从网址中删除了开放部分/协议,因为我没有发布这么多链接的声誉,但一切都是https。

我的页面是:www.qponverzum.hu/ajanlat/budapest-elozd-meg-a-hajhullast-mikrokameras-hajdiagnosztika-hajhagyma-es-fejborvizsgalattal-tanacsadas-5000-ft-helyett-2500-ft-ert -biohajklinika-szepsegapolas-egeszseg /安培

来自AMP缓存:www-qponverzum-hu.cdn.ampproject.org/c/s/www.qponverzum.hu/ajanlat/budapest-elozd-meg-a-hajhullast-mikrokameras-hajdiagnosztika-hajhagyma-es- fejborvizsgalattal-tanacsadas-5000-FT-helyett-2500-FT-ERT-biohajklinika-szepsegapolas-egeszseg /安培

我一直在关注developers.google.com/amp/cache/update-ping

中的文档

如果我发出/ update-ping请求,它似乎工作正常,返回200无内容响应,但由于我们想要使用/ update-cache的大量网址/页面,因为它允许更高的请求率。

我创建了一个私有和公共RSA密钥,并在www.qponverzum.hu/.well-known/amphtml/apikey.pub上提供了公钥。

我一直在尝试使用以下php代码来生成update-cache url

$ampBaseUrl = "https://www-qponverzum-hu.cdn.ampproject.org";
$signatureUrl = '/update-cache/c/s/www.qponverzum.hu/ajanlat/budapest-elozd-meg-a-hajhullast-mikrokameras-hajdiagnosztika-hajhagyma-es-fejborvizsgalattal-tanacsadas-5000-ft-helyett-2500-ft-ert-biohajklinika-szepsegapolas-egeszseg/amp?amp_action=flush&_ts='.time();

// opening the private key
$pkeyid = openssl_pkey_get_private("file://private-key.pem");

// generating the signature
openssl_sign($signatureUrl, $signature, $pkeyid)

// urlsafe base64 encoding
$signature = urlsafe_b64encode($signature);

// final url for updating
$ampUrl = $ampBaseUrl.$signatureUrl."&amp_url_signature=".$signature;

我正在使用的urlsafe_b64encode函数:

function urlsafe_b64encode($string) {
    return str_replace(array('+','/','='),array('-','_',''), base64_encode($string));
}

$ ampUrl最终看起来像这样:https://www-qponverzum-hu.cdn.ampproject.org/update-cache/c/s/www.qponverzum.hu/ajanlat/budapest-elozd-meg-a-hajhullast-mikrokameras-hajdiagnosztika-hajhagyma-es-fejborvizsgalattal-tanacsadas-5000-ft-helyett-2500-ft-ert-biohajklinika-szepsegapolas-egeszseg/amp?amp_action=flush&amp_ts=1500362660&amp_url_signature=NjTCnmqUGpMY_CokGxchoczSOxnTLQvcQsX4fv2gIhW3H8hVw24mKCpmNoyV-9LND3OAR9ld80KeMH3lip863p_wBorIy1BAag7bRfvWcxsPrbqbox87VMrUWCEsry5epWxKYl2qNCT1GMv8SYAJ5WR0QZR0Qjvw5MXfZjohmbvrxJ7mWlc7fcvWoIXuO_q_yFkhi7A-fOZWm9sy8UDIlq-zNEPkVUwfqfWc_HbNHgvrk9Z6zZSNzB-dWAOT6QYAc1KeEVOIbvQxKkLkGMArTpydj5iLxz0aERvglKRl215Bqh6_jZu95T5yKv7X4R127ylpWYW2YDlTR9bgRE7Faw

如果我对此网址(使用浏览器或curl)发出简单的GET请求,则会收到403错误(“您的客户端无权获取网址”)。

我已经检查了网络服务器日志,但似乎没有对公钥网址发出任何请求。

我想我错过了一些非常明显的东西,所以任何反馈都会非常感激。

3 个答案:

答案 0 :(得分:2)

$signatureUrl中出现错误 - 在查询参数中应该 amp_ts 而不是 _ts ,在openssl_sign中添加第四个参数 openssl_sign($signatureUrl, $signature, $pkeyid, OPENSSL_ALGO_SHA256);

签名需要使用 SHA256 进行签名,如果省略它使用的最后一个参数 SHA1

我已经使用你的脚本对我的工作项目进行了这两项更改,并且工作正常。

如果没有问题,它应该在响应正文中返回“OK”。

选中此https://gist.github.com/krzysztofbukowski/739ccf4061d69360b5b2c8306f5878bd

答案 1 :(得分:1)

尝试将响应内容类型设置为" text / plain" https://www.qponverzum.hu/.well-known/amphtml/apikey.pub

中建议的here

======

我使用脚本进行更新缓存,但是我收到了403禁用错误。 很难调试并找出根本原因。 有人成功了吗?

答案 2 :(得分:0)

所有其他答案真的有帮助 - 谢谢。我在这里添加了一点,希望也有所帮助。

正如@ kul3r4指出的那样(我第一次错过了它)apikey.pub文件需要作为纯文本提供。这是Nginx配置规则;

    location /.well-known/amphtml/apikey.pub { ## serve amp public key as plain/text
         default_type text/plain;
    }

如果你回应@Krzysztof Bukowski对屏幕的回答,&amp在url参数中的事实意味着我的浏览器正在剥离amp的{​​{1}}部分amp_ts请注意这一点。

如果你正在努力解决这个问题的文件路径和语法;

amp_url_signature

然后,只需按照此答案将私钥的内容放入变量 - > Openssl and PHP