我突然收到了很多网站请求(使用wget,curl等工具)。
我不想执行任何这些请求,除非用户至少使用有效的浏览器(如Firefox或Chrome)访问过我的网站。
是否有一个Apache模块可以实现这个功能?我该怎么办?
这个概念很简单:创建一个令牌,在你想要保护的文件中使用。这个令牌(类似于“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]
虽然这不是万无一失的。