首页 > 解决方案 > 使用 cloudflare SSL 时如何不重定向 Twitterbot?

问题描述

Twitter 卡(twitter:image 或 og:image)不允许来自共享 SSL 的 https,包括 Cloudflare。提到的解决方法是创建一个 .htaccess 文件并添加代码以将 twitterbot 重定向到共享的 https。问题是这打破了我的页面,说重定向太多。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteCond %{HTTP_HOST} ^example.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteCond %{HTTP_USER_AGENT} !Twitterbot [NC]
RewriteRule ^(.*)$ https://www.example.com/$1 [L,R=301,NC]
</IfModule>

话虽如此,当我通过 Twitter Card Validator 运行该页面时,当我拥有该 .htaccess 代码时,图像确实在 Twitter Card Validator 上显示得很好。但正如我所提到的,网站因重定向过多而中断。

我尝试删除 .htaccess 代码并将 twitter 卡图像放在名为 /social/ 的目录中,并将此页面规则放入 Cloudflare:example.com/social/ - 禁用安全性作为第一条规则(每页只有一个规则有效),这只是被 twitterbot 忽略了,即使我手动将图像的路径放在该目录中,它也没有正确地重定向到 https。

<meta property="og:image" content="http://example.com/social/image.jpg">
<meta name="twitter:image" content="http://example.com/social/image.jpg">

在 Twitter Card Validator 上验证页面并使用 ?utm_source=a-random-number 来确保它拉出一个新页面时,它会正确拉出除图像之外的所有信息。Facebook 拉图像很好,只是 twitterbot 与 Cloudflare 的灵活共享 SSL 不兼容。我不在 WordPress 上,这是在 Apache 上。当前没有 .htaccess 文件。有任何想法吗?

==============

编辑

好的,让它工作。添加的解决方案:example.com/social/ - 在 Cloudflare 的 SSL 页面规则上禁用安全性是正确的,但我还必须在头部包含两个元 og 参数:

<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />

否则,图像不会显示在 Twitter Card Validator 上,但在添加时会显示。希望对其他人有所帮助。

标签: .htaccessssltwittercloudflare

解决方案


重定向循环不是由 Twitterbot 异常引起的(这只会阻止规则被执行),而是因为您正在检查SERVER_PORT. 使用“Cloudflare 的灵活共享 SSL”时,您的应用程序服务器始终在端口 80(即 HTTP)上进行通信。Cloudflare 是一个 SSL 代理。从客户端到 Cloudflare 的连接是安全的,但从 Cloudflare 到您的应用程序服务器的连接不安全。参考: https: //support.cloudflare.com/hc/en-us/articles/200170416#h_4e0d1a7c-eb71-4204-9e22-9d3ef9ef7fef

您应该检查HTTP 请求标头(由 Cloudflare 代理设置),而不是检查SERVER_PORT以确定客户端是否尚未建立 HTTPS 连接。X-Forwarded-Proto参考: https: //support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-

例如:

RewriteEngine On
RewriteCond %{HTTP:X-Forwarded-Proto} !https [NC]
RewriteCond %{HTTP_HOST} ^(www\.)?example\.com [NC]
RewriteCond %{HTTP_USER_AGENT} !twitterbot [NC]
RewriteRule (.*) https://www.example.com/$1 [R=301,L]

我已经结合了检查主机名的两个条件(也避免了对OR标志的需要)。除非您从此帐户提供多个域/子域/主机名,否则根本不需要该条件。

您需要在测试前清除浏览器缓存。(使用 302 进行测试 - 临时 - 重定向以避免缓存问题。)


推荐阅读