问题描述
我有一个带有动态内容的 SPA 应用,可以在 Facebook 上共享,因此我使用 htaccess 中的以下规则将 Facebook 爬虫重定向到一个不错的静态页面:
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit.*$
RewriteRule ^(.*)$ https://sharing.mysite.tld/api/share/$1 [L]
这很好用!但是有一个问题......我无法让我的应用上线,因为 Facebook 需要一个指向隐私政策、条款和条件等的链接 - 而这些也会被重定向!!
我需要忽略某些 URL - 在 /docs/ 中请求的任何内容 - 来自上述规则 编辑:这样包含 /docs/ 的 URL 将被正常遵循(没有重定向,只是正常提供)。 我无法让 .htaccess 了解忽略规则。我本以为会这样做(感谢 https://stackoverflow.com/a/1848579/4881971):
RewriteRule ^(docs)($|/) - [L]
所以我原以为我的 .htaccess 文件看起来像这样:
<IfModule mod_rewrite.c>
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit.*$
RewriteRule ^(docs)($|/) - [L]
RewriteRule ^(.*)$ https://sharing.mysite.tld/api/share/$1 [L]
但是当我在 https://mysite.tld/docs/privacy 上使用 Facebook Object Debugger 时,我得到了 404!它重定向到 https://sharing.mysite.tld/api/share/docs/privacy
如何保留规则但忽略来自 mysite.tld/docs/* 的请求?谢谢。
解决方法
能否请您尝试以下操作,请确保在测试您的 URL 之前清除浏览器缓存。这认为您的 uri 从 docs
开始。
<IfModule mod_rewrite.c>
RewriteEngine ON
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit.*$ [NC]
RewriteCond %{REQUEST_URI} ^/docs [NC]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ https://sharing.mysite.tld/api/share/$1 [L]
如果您想传递文档可以出现在 uri 中任何位置的 URL(而不是从第一个解决方案寻找的内容开始),请尝试遵循规则。
<IfModule mod_rewrite.c>
RewriteEngine ON
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit.*$ [NC]
RewriteCond %{REQUEST_URI} docs [NC]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^(.*)$ https://sharing.mysite.tld/api/share/$1 [L]
,
用否定条件来做这样的事情:
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^facebookexternalhit [NC]
RewriteRule %{THE_REQUEST} !\s/+docs [NC]
RewriteRule ^ https://sharing.mysite.tld/api/share%{REQUEST_URI} [L,R=301,NE]