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 后,仍然出现“请求的资源上没有“访问控制允许来源”标头”错误:*

没有“访问控制允许来源”Angular 4 应用程序

访问控制允许来源多个来源域?

访问控制允许来源多个来源域?

访问控制允许来源多个来源域?

访问控制允许来源多个来源域?