如果用户没有访问我的网站,如何阻止图像、CSS或JS加载?

17

我突然收到了很多网站请求(使用wget,curl等工具)。

我不想执行任何这些请求,除非用户至少使用有效的浏览器(如Firefox或Chrome)访问过我的网站。

是否有一个Apache模块可以实现这个功能?我该怎么办?

1个回答

24

这个概念很简单:创建一个令牌,在你想要保护的文件中使用。这个令牌(类似于“abc123”的密钥-保存在会话中,而不是cookies)将在加载每个文件时使用。

这样,如果从文件中获取的令牌与之前设置的不匹配,则可以重定向到未找到页面或拒绝访问页面。

index.php中设置令牌:

<?php
  session_start();
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  $_SESSION['siteToken'] = "abc123";
?>

<html>
<head> 
  <link rel="stylesheet" type="text/css" href="/style.css" />
</head>
<body>

现在对于 CSS 和 JavaScript 文件,您需要检查令牌以确保它已设置且值正确。

// style.css
<?php
  session_start();
  header("Content-type: text/css");
  header("Cache-Control: no-cache, must-revalidate");
  header("Expires: Mon, 10 Oct 2005 05:00:00 GMT");
  if($_SESSION["siteToken"] != "abc123") {
    session_regenerate_id();
    die(); // or redirect
  } 
?>
body { background-color: #000; color: #fff; }
etc...

对于 JavaScript 文件,您需要做同样的操作。

接下来是更新 .htaccess 文件以确保 CSS 和 JavaScript 文件被正确解析的步骤:

RewriteEngine on
RewriteBase /
RewriteRule style.css style.php [NC,L]

另外,您可以在您的 .htaccess 文件中添加以下内容来保护不良机器人免于查询文件:

SetEnvIfNoCase User-Agent "^Wget" bad_bot
SetEnvIfNoCase User-Agent "^EmailSiphon" bad_bot
SetEnvIfNoCase User-Agent "^EmailWolf" bad_bot
SetEnvIfNoCase User-Agent "^libwww-perl" bad_bot
#etc...
Deny from env=bad_bot

现在来谈谈图片的问题。这种解决方案也可以运作,但是它会比解析CSS和JavaScript文件慢。

逻辑相同,但是你需要读取文件(使用readfile函数)而不是输出。此外,你还需要根据文件扩展名更改头信息。

另一种方法是在你的.htaccess文件中设置:

RewriteCond %{HTTP_REFERER} !^http(s)?://(www\.)?domain.com [NC]
RewriteRule \.jpg$ - [NC,F,L]

虽然这不是万无一失的。


非常有趣,谢谢。我会尝试使用图片,如果出现性能问题,我会使用RewriteRule。非常感谢! - Tech4Wilco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接