2015-09-25 127 views
1

我想为Apache 2.2中的.htaccess文件中的一组特定的RewriteCond创建特定的403消息(或页面)。我从来没有见过这样做,但似乎它应该是可能的。特定的RewriteCond自定义403页面

我的.htaccess访问文件的相关部分看起来是这样的:

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteRule .* - [F] 

正如你所看到的,我刚刚从接入阻止他们如果用户代理我的RewriteCond匹配。

多一点细节

这个伟大的工程阻止违规的机器人,但我们碰到一个稍微恼人的问题。我们的网站被许多技术人员访问。他们自己做了很多编程,并经常使用浏览器插件,如“用户代理切换器”。

我想在此特定实例中提供更有意义的消息。以便他们知道将“用户代理切换器”更改为普通浏览器。我不希望只提供正常的403页面,而是希望在此发布更友好的消息。

我知道我可以将它传递给我们的脚本引擎,拔出用户代理并传递自定义头文件,但似乎这可能会有更优雅的.htaccess解决方案。

回答

2

所以...为什么不只是重定向到一个自定义的403文件?并在该HTML文件,你把你想要的。机器人总是会被送到那里。

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteCond %{REQUEST_URI} !^/errorpages/403.html [NC] 
RewriteRule ^.* /errorpages/403.html [R,L] 
+0

这是真的很接近我所需要的。我碰到的一个问题是,你上面提到的条件不包括访问403页面。你陷入循环,浏览器出错。对于访问此答案的其他人,您是否可以修改答案以使用403的errorpages目录(因为根级被您的语句阻塞),然后将其作为第一个条件:'RewriteRule^errorpages - [L,NC ]'如果你这样做,我测试过,它的工作原理。在修复之后,我会让你高兴。 – Terry

+0

@特里是的,你说得很对。我修复它,所以它不应该导致循环。 –

1

假设你有一个定制 403错误页面,你可以只在您的错误页面相同的用户代理检查,并显示相应的反应。或者,在.htaccess中设置一个特定的环境变量(例如SPECIAL_ERROR),然后在错误页面中检查这个变量。例如:

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteRule .* - [F,E=SPECIAL_ERROR:1] 

这样可以避免“重定向”往返。

然后,在你的403错误页面...(PHP为例):

if (getenv('SPECIAL_ERROR')) { 
    // friendly error 
} else { 
    // Default 403 
} 
+0

这实际上非常有用。我不知道你可以像这样在htaccess中设置特殊的环境变量。 – Terry