是否可以先应用重写然后使用.htaccess拒绝/应用IP块?

时间:2013-05-20 10:23:30

标签: .htaccess

是否可以在使用.htaccess文件拒绝/允许IP阻止之前应用重定向?

我尝试过关注,但是没有重定向未列入白名单的用户被阻止,这意味着即使应该重定向也拒绝执行拒绝/允许部分。重定向部分工作正常,因为我测试它没有任何IP阻止。我预计重写中的[L]标志会在到达IP阻塞部分之前“停止”.htaccess执行。

RewriteCond %{HTTP_HOST} !^blog\.mysite\.com$ [NC]
RewriteRule (.*) http://www.mysite.com [L,NC,R=301]

Order deny,allow
Deny from all
Allow from xxx.xxx.xxx.xxx

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php?/$1 [L]

为什么我这样做是因为我应该保护对http://www.mysite.com/blog的访问权限,同时仍然显示与网站为其他无效页面显示的相同的404。如果首先执行IP阻止,我无法显示由站点框架生成的相同404页面。

我做错了什么或者不能这样做?

1 个答案:

答案 0 :(得分:2)

您可以使用重写条件来检查IP地址:

RewriteEngine On
RewriteBase /

#always redirect blog.mysite.com to www.mysite.com
RewriteCond %{HTTP_HOST} ^blog\.mysite\.com$ [NC]
RewriteRule (.*) http://www.mysite.com [L,NC,R=302]

#don't redirect if the accessDenied.php page is accessed
RewriteCond %{REQUEST_FILENAME} ^accessDenied\.php$
RewriteRule (.*) - [L]

#redirect all not whitelisted IPs
RewriteCond %{REMOTE_ADDR} !^111\.111\.111\.111 [or]
RewriteCond %{REMOTE_ADDR} !^222\.222\.222\.222
RewriteRule (.*) accessDenied.php [R=302,L]

#only whitelisted IPs will use this rewrite rule
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*) index.php?/$1 [L,R=302]

如果ip匹配,则不会满足第二次重写规则,因此不会发生任何事情。但如果ip不匹配,用户将被重定向到404错误页面。