使用 htaccess 将机器人和用户发送到不同的位置

Using htaccess to send bots and users to different locations

我正在尝试设置一个条件 .htaccess 文件,它将 google 和 facebook 机器人发送到我网站的服务器端呈现版本。对于普通用户,所有请求都应重定向到 index.html,因为我有一个基于 JavaScript 的路由器,它将读取 URL 并根据 URL 渲染视图。

这是我的

<IfModule mod_rewrite.c>
  RewriteEngine on

  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f [OR]
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
  RewriteRule ^ - [L]
  RewriteRule ^ /index.html [L]

  RewriteCond %{HTTP_USER_AGENT} facebookexternalhit|Facebot|Googlebot [NC,OR]
  RewriteRule .* /sharehandler/index.php [L]
</IfModule>

目前所有内容都重定向到 index.html。包括 Googlebot 和 Facebot。

如果我将机器人行移到顶部:

RewriteCond %{HTTP_USER_AGENT} facebookexternalhit|Facebot|Googlebot [NC,OR]
RewriteRule .* /sharehandler/index.php [L]

然后所有内容都被重定向到 /sharehandler/index.php,包括所有常规用户。 RewriteCond 似乎没有被评估,服务器只是触发它看到的第一个 RewriteRule,无论如何。

您的非机器人部分不排除来自机器人的点击,因此如果它是第一个,它将匹配所有内容。您的机器人部分包含一些错误,我怀疑这些错误使其匹配所有内容,因此按原样将其放在第一位也会匹配所有内容。

如果您将(工作中的)机器人部分放在前面,只有不符合这些条件的访问者才能到达下一个部分。

所以,首先是机器人部分:

  • 你只有 1 个 RewriteCond,所以 [OR] 是不必要的(可能为什么它放在顶部时匹配所有内容?条件 1 OR 没有条件总是匹配?)

  • RewriteCond docs 包括一个如何基于用户代理进行重定向的示例。您的正则表达式是一个子模式,因此应该放在括号中。文档也引用了它。

对于非机器人部分:

  • 不要使用[OR],当请求既不是现有文件也不是现有目录时,你想匹配。

  • 您在本节中有 2 个 RewriteRules,应该只有 1 个。

  • 本节中正确的 RewriteRule 中的模式不是有效的正则表达式。

这是应用了上述修复的更新版本:

<IfModule mod_rewrite.c>
  RewriteEngine on

  RewriteCond "%{HTTP_USER_AGENT}" "(facebookexternalhit|Facebot|Googlebot)" [NC]
  RewriteRule .* /sharehandler/index.php [L]

  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -f
  RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI} -d
  RewriteRule .* /index.html [L]
</IfModule>

谢谢你!我帮助了我足够多,所以我可以自己完成它。

我必须添加 RewriteBase / 才能正确重定向普通用户,而且我还必须使用 %{REQUEST_FILENAME} 来代替最终结果。

<IfModule mod_rewrite.c>
  RewriteEngine on

  RewriteCond "%{HTTP_USER_AGENT}" "(facebookexternalhit|Facebot|Googlebot)" [NC]
  RewriteRule .* /sharehandler/index.php [L]

  RewriteBase /
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule .* /index.html [L]
</IfModule>