AMP 访问控制允许 Source Origin 标头问题
Posted
技术标签:
【中文标题】AMP 访问控制允许 Source Origin 标头问题【英文标题】:AMP Access Control Allow Source Origin header Issue 【发布时间】:2018-02-26 03:24:14 【问题描述】:如何解决以下错误;
加载资源失败:服务器响应状态为 500(内部服务器错误) cdn.ampproject.org/v0.js:68 响应必须包含 AMP-Access-Control-Allow-Source-Origin 标头 码@cdn.ampproject.org/v0.js:68 cdn.ampproject.org/v0.js:68 表单提交失败:错误:响应必须包含 AMP-Access-Control-Allow-Source-Origin 标头reported
遵循AMP GitHub Page on CORS 的所有说明。
下面是我在服务器端的 php 代码和浏览器控制台中的错误截图;
【问题讨论】:
对于.htaccess解决方案,请尝试wpza.net/accelerated-mobile-pages/… 【参考方案1】:这可能会减轻一两次头痛。我绕了好久;
请注意,在上面公认的答案中,如果 https://example.com 恰好是一个带有连字符的域名,则字符串替换将不会给出所需的结果。
例如https://www.my-domain.com需要转成https://www-my--domain-com 不会。
header("Access-Control-Allow-Origin: ". str_replace('.', '-','https://www.my-domain.com') .".cdn.ampproject.org");
需要
header("Access-Control-Allow-Origin: https://www-my--domain.com.cdn.ampproject.org");
所以
$h = 'https://www.my-domain.com';
$h = str_replace('-', '--',$h);
$h = str_replace('.', '-',$h).'.cdn.ampproject.org';
然后
header("Access-Control-Allow-Origin: " . $h);
【讨论】:
【参考方案2】:虽然 OP 使用 PHP,但我在这里发帖是为了我的 javascript 窥视。
node express服务器可以使用amp-toolbox-cors,提供中间件。
const express = require('express');
const ampCors = require('amp-toolbox-cors');
const app = express();
// That's it!
app.use(ampCors());
...
默认情况下,AMP CORS 中间件仅允许来自https://cdn.ampproject.org/caches.json 上列出的 AMP 缓存的请求(添加了 bing-amp.com)。
所有其他来源都会收到 403 响应。
所以对于 localhost 或开发测试,你们可能还想添加以下内容:
app.use(ampCors(
verifyOrigin: false
));
对于那些想要更深入地了解的人,这里是有关如何遵守AMP CORS 的官方文档的链接。
【讨论】:
【参考方案3】:请尝试以下代码
if(!empty($_POST))
$domain_url = (isset($_SERVER['HTTPS']) ? "https" : "http") . "://$_SERVER[HTTP_HOST]";
header("Content-type: application/json");
header("Access-Control-Allow-Credentials: true");
header("Access-Control-Allow-Origin: ". str_replace('.', '-','https://example.com') .".cdn.ampproject.org");
header("AMP-Access-Control-Allow-Source-Origin: " . $domain_url);
header("Access-Control-Expose-Headers: AMP-Access-Control-Allow-Source-Origin");
header("AMP-Redirect-To: https://example.com/thankyou.amp.html");
header("Access-Control-Expose-Headers: AMP-Redirect-To, AMP-Access-Control-Allow-Source-Origin");
echo json_encode(array('successmsg'=>'data post'));
exit;
请确保域 url 应该是 https
将https://example.com/ 替换为您想要的网址
【讨论】:
在 IIS 服务器中进行了一些更改。感谢您的支持。 真的需要使用https吗?以上是关于AMP 访问控制允许 Source Origin 标头问题的主要内容,如果未能解决你的问题,请参考以下文章
添加 Access-Control-Allow-Origin 后,仍然出现“请求的资源上没有“访问控制允许来源”标头”错误:*