是否可以使用 mod_rewrite 强制所有进入站点的用户(通过其他站点的链接或在地址栏中输入 URL)重定向到主页?从主页(或站点内的任何页面),用户应该能够访问站点中的其他页面。但所有用户都将被强制通过主页进入站点。可以使用 mod_rewrite 来实现(或不使用脚本语言)吗?
答案1
当然,也有一些缺点。简单版本如下所示:
RewriteCond %{HTTP_REFERER} !example.com
RewriteRule ^/. / [R]
这将检查引荐来源不包含您的域名,然后对于在第一个斜杠后包含内容的任何 URI(即,除主页之外的任何页面),将用户重定向到主页。
对于不发送引荐来源或修改引荐来源的用户,这将彻底破坏您的网站。例如,某些隐私应用程序会将引荐来源更改为shttp://xxxxxxxxxxxxxxxxxxxxxxx
的数量x
与原始真实引荐来源的长度相匹配。
如果您发送的电子邮件中包含从您的网站热链接的图像,则上述规则也会违反。
对于点击其他网站(如 Google)特定页面链接的访问者来说,这也会带来糟糕的可用性。然后他们会被重定向到主页,不知道如何返回到他们之前所在的页面。这些访问者很可能会点击后退按钮并选择不同的搜索结果。您可以通过更改重写规则来改善这种情况。
RewriteCond %{HTTP_REFERER} !example.com
RewriteRule ^(/.+) /?prev=$1 [R]
然后,您可以在主页上使用您的应用提供返回他们所在页面的链接。您还可以使用 mod_rewrite 设置 cookie,以便?prev=$1
将其存在于 cookie 中。
可能还有其他我未曾预见到的可用性缺陷。如果你实施了这一点,你应该密切关注你的访客。
我刚刚想到了另一个缺点:机器人很少发送引荐来源。如果您按书面方式实施此操作,并且不维护所需机器人的完整列表(用户代理和/或 IP 范围)并为其禁用它,那么您的网站将无法被搜索引擎机器人抓取。
答案2
您可以使用 PHP:
我首先想到的是使用“$_SERVER['HTTP_REFERER']”,但是,据我所知,无论是否显示,用户都可以在客户端禁用此功能,如果我错了,请纠正我。因此,您可以执行类似伪代码的操作:
if $myDomain is part of $_SERVER['HTTP_REFERER'] then
redirect
else
do nothing
由于人们可以改变这一点,你可以在 PHP 中引入一个会话变量。伪代码:
if empty( $_SESSION['newvisitor'] ) && !isset($_SESSION['newvisitor'])
{
$_SESSION['newvisitor'] = true;
}
else
{
$_SESSION['newvisitor'] = false
}
if ( $_SESSION['newvisitor'] )
{
#redirect to home
}
因此,脚本首先会检查变量是否已设置,如果未设置,则一定是新访问者,因此应该重定向到主页。如果确实设置了主页,则不应重定向。
编辑:认识到,我的第一个解决方案是错误的,因为如果他实际上来自子页面,它就无法匹配。