.htaccess 允许社交媒体爬虫工作(Facebook 和 Twitter)| Angular 11 个SPA

.htaccess allow social media crawlers to work (Facebook and Twitter) | Angular 11 SPA

我创建了一个 SPA - 单页应用程序 Angular 11,我将其托管在共享托管服务器上。

我遇到的问题是我无法在社交媒体(Facebook 和 Twitter)上分享我拥有的任何页面(第一个路径 - / 除外),因为元标记没有更新(我有根据请求的页面处理每个页面的元标记的服务(我知道这是因为 Facebook 和 Twitter 没有抓取 JavaScript)。

为了解决这个问题,我尝试了 Angular Universal(SSR - 服务器端渲染)和 Scully(创建静态页面)。两者(Angular Universal 和 Scully)都在解决我的问题,但我更愿意使用默认的 Angular SPA 构建。

我采用的方法:

- crawlers/
           - crawlers.php
           - share/
                   - 404.json
                   - about.json
                   - work.json
- .htaccess
- index.html
<?php

$page = filter_input(INPUT_GET, 'page');

if (file_exists('./share/'.$page.'.json')) {
    $file = file_get_contents('./share/'.$page.'.json');
} else {
    $file = file_get_contents('./share/404.json');
}

$data = json_decode($file);

return makePage($data); 

function makePage($data) { 
    $html  = '<!doctype html>'.PHP_EOL;
    $html .= '<html>'.PHP_EOL;

    $html .= '<head>'.PHP_EOL;

    $html .= '<meta property="og:type" content="website" />'.PHP_EOL;
    $html .= '<meta property="og:site_name" content="My Website" />'.PHP_EOL;
    $html .= '<meta property="og:title" content="'.$data->title.'" />'.PHP_EOL;
    $html .= '<meta property="og:description" content="'.$data->description.'" />'.PHP_EOL;
    $html .= '<meta property="og:image" content="'.$data->image.'" />'.PHP_EOL;

    $html .= '<meta name="twitter:card" content="summary_large_image"/>'.PHP_EOL;
    $html .= '<meta name="twitter:title" content="'.$data->title.'" />'.PHP_EOL;
    $html .= '<meta name="twitter:description" content="'.$data->description.'" />'.PHP_EOL;
    $html .= '<meta name="twitter:image" content="'.$data->image.'" />'.PHP_EOL;
    
    $html .= '<meta http-equiv="refresh" content="0;url='.$data->url.'">'.PHP_EOL;

    $html .= '</head>'.PHP_EOL;
    $html .= '<body></body>'.PHP_EOL;

    $html .= '</html>';

    echo $html;
}

?>

og:url 未指定,因为我认为不指定它,Facebook 将不知道实际内容 URL 并将其卡片 link 写入静态文件。这应该不是问题,因为我使用了 http-equiv="refresh",它将普通用户重定向到正确的 URL.

{
  "title": "404: Not Found | My Website",
  "description": "My awesome description.",
  "image": "https://www.mywebsite.com/assets/images/share/404.jpg",
  "url": "https://www.mywebsite.com",
}

RewriteEngine On
RewriteBase /

# Allow robots.txt to pass through
RewriteRule ^robots.txt - [L]

# Allow social media crawlers to work
RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit/[0-9]|Twitterbot)
RewriteRule ^(.+)$ /crawlers/crawlers.php?page= [NC,L]

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# If the requested resource doesn't exist use index.html
RewriteRule ^ /index.html

当我测试 crawlers/crawlers.php?page=test-page 时,它​​运行良好(在访问 https://www.mywebsite.com/crawlers/crawlers.php?page=test-page 之后),我认为问题出在 . htaccess 条件低于 # Allow social media crawlers to work。在 Facebook 上分享仍然显示第一个路由 (/) 的元标记,这意味着重定向到 crawlers/crawlers.php 不起作用。
此外,在 https://developers.facebook.com/tools/debug/sharing/ 上 url https://www.mywebsite.com/about 没有重定向到 https://www.mywebsite.com/crawelers/crawlers.php?page=about

我想将重定向到 crawlers/crawlers.php 用于社交媒体抓取工具,仅用于以下页面:https://www.mywebsite.com/abouthttps://www.mywebsite.com/work 等,但不适用于 https://www.mywebsite.com(第一条路线-/).

非常感谢任何帮助。谢谢!

感谢@CBroe 的指导,我设法让社交媒体(Facebook 和 Twitter)爬虫工作(不使用 Angular Universal、Scully、Prerender.io 等)Angular 11 SPA - 单页应用程序,我托管在共享托管服务器上。

我在上面的问题中遇到的问题在 .htaccess.

这是我的 .htaccess(按预期工作):

RewriteEngine On

# Force www.
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/ [R=301,L]

# If an existing asset or directory is requested go to it as it is
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
RewriteRule ^ - [L]

# Allow robots.txt to pass through
RewriteRule ^robots.txt - [L]

# Allow social media crawlers to work
RewriteCond %{HTTP_USER_AGENT} (facebookexternalhit|WhatsApp|LinkedInBot|Twitterbot)
RewriteRule ^(.+)$ /crawlers/social_media.php?page= [R=301,L]

# If the requested resource doesn't exist use index.html
RewriteRule ^ /index.html

PS 我将 crawlers.php 重命名为 social_media.php,添加了 WhatsApp 和 LinkedIn 用户代理,还添加了从 mywebsite.com 到 [=15 的重定向=]