.htaccess - 使用 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 上,但在添加时会显示。希望对其他人有所帮助。
解决方案
重定向循环不是由 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 进行测试 - 临时 - 重定向以避免缓存问题。)
推荐阅读
- arrays - 如何从另一个类 VB.NET 将项目添加到数组
- c++ - 如何随机化双精度/浮点数据类型?C++
- javascript - HERE 地图 - 将标记从一个位置移动到另一个位置
- python - 如何在for循环python中获取一堆值的平均值、最小值等
- reactjs - 如何加入两个 React Native 应用程序
- r - 将 mapply 生成的列表转换为矩阵或数据框
- python - Kivy:自定义类与 ScreenManager 不兼容(?)
- python - 用不同表中的另一个值检查一个值
- c++ - 即使我用 -L 指定了它的位置,链接器也找不到库
- excel - Excel:某些行内的动态范围+数据验证更新