使用.htaccess阻止网站上某些特定IP范围的链接

时间:2013-11-05 10:41:30

标签: php .htaccess block

我们服务器上的 PHP 页面上有一个视频链接。当特定用户来自特定区域时(假设来自拉丁美洲)将显示视频链接。但是一旦用户点击链接,我想将用户重定向到禁止的页面。

我可以使用 .htaccess 文件吗?

2 个答案:

答案 0 :(得分:1)

要根据特定文件限制访问,请使用以下命令:

示例:

<Files wp-login.php>
    order deny,allow
    deny from all
    allow from 139.82.0.0/16
</Files>

能够根据国家/地区mod_geoip2 Apache module使用地理位置和重定向客户端:

示例:

GeoIPEnable On
GeoIPDBFile /path/to/GeoIP.dat

# Redirect one country
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^CA$
RewriteRule ^(.*)$ http://www.canada.com$1 [R,L]

# Redirect multiple countries to a single page
RewriteEngine on
RewriteCond %{ENV:GEOIP_COUNTRY_CODE} ^(CA|US|MX)$
RewriteRule ^(.*)$ http://www.northamerica.com$1 [R,L]

另一种解决方案是手动插入将被阻止的IP列表。有一个名为HTACCESS Block Country by IP Range的在线服务可以为您生成要阻止的IP列表。

示例:

# BLOCK COUNTRY BY IP RANGE
# IncrediBILL's HTACCESS Tools
# http://incredibill.me
<Limit GET POST HEAD>
order allow,deny
#
# Block from BRAZIL (BR)
#
deny from 139.82.0.0/16
deny from 143.54.0.0/16
deny from 143.106.0.0/16
deny from 143.107.0.0/16
deny from 143.108.0.0/16
deny from 146.134.0.0/16
deny from 146.164.0.0/16
deny from 147.65.0.0/16
deny from 150.161.0.0/16
deny from 150.162.0.0/16
deny from 150.163.0.0/16

另一种可能且最合适的解决方案是使用 PHP geoip module,因为您希望限制用户访问页面的某些部分并进行操作它使用 PHP 要好得多。

首先,安装php-pecl-geoip module for PHP。根据您的服务器配置,安装通常是直截了当的。如果您使用 RedHat / CentOS ,只需运行:yum install php-pecl-geoip。您必须拥有对服务器的root访问权才能安装软件,如果您使用的是共享主机,请让管理员为您执行此操作。

安装完成后,您将获得全新的set of PHP functions。您当前应该使用的是geoip_continent_code_by_name(),因为您要求阻止南美洲的所有用户

将它应用于您的示例很简单:

if ( geoip_continent_code_by_name( $_SERVER['REMOTE_ADDR'] ) == 'SA'  ) {
    echo '<a href="#">YouTube Video Example: This video is not available for South America.</a>';
} else {
    echo '<a href="http://www.youtube.com/watch?v=videoCode">YouTube Video Example</a>';
}

要在您的服务器上对其进行测试,您只需将$_SERVER['REMOTE_ADDR']替换为属于巴西的其中一个IP,例如:geoip_continent_code_by_name('146.164.22.1');

答案 1 :(得分:0)

RewriteCond %{REMOTE_HOST} !^123\.456\.789

RewriteCond %{REQUEST_URI} !^/blog/?

RewriteCond %{REQUEST_URI} /(.*)$

RewriteRule (.*) /blog [R=301,L]

.htaccess redirect