一般来说,网站可以用域名和IP来访问,通过IP直接访问,本来这没什么问题,但是会有些隐患:

1. 影响搜索引擎权重

由于搜索引擎收录你网站域名,同时也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高。

2. 恶意域名重定向

域名恶意指向的可能。记得 google.com.sb 事件吗?google.com.sb 这个域名被恶意指向了百度,后来证实了 google.com.sb 这个域名为第三者恶意指向的,并不是Google所为。当然这只是个玩笑,但是如果被人恶意用别的域名解析到你的IP的话,那么你的网站就能通过别人的域名来访问了。接下来会发生什么?假如那域名是不友善的域名,比如曾经指向非法网站,容易引发搜索引擎惩罚,连带IP受到牵连。即使域名没什么问题,但流量也会被劫持到别的域名,从而遭到广告联盟的封杀。

 

禁止直接通过IP访问网站

如何解决这个问题?最直接的方法是让用户只能通过域名来访问网站,而不能通过IP来直接访问。

这个可以修改Apache配置文件httpd.conf来实现,下面是米扑博客的实现:(实测不可行

vim   /etc/httpd/conf/httpd.conf

NameVirtualHost 115.29.237.28

# 拒绝直接使用IP(115.29.237.28)访问
<VirtualHost 115.29.237.28>
	ServerName 115.29.237.28
	<Location />
		Order Allow,Deny
		Deny from all
	</Location>
</VirtualHost>


# 把IP(115.29.237.28)访问定向到域名访问
<VirtualHost 115.29.237.28>
	DocumentRoot /var/www/blog/
	ServerName blog.mimvp.com
</VirtualHost>
 

# 把IP(115.29.237.28)访问定向到顶级域名访问
<VirtualHost 115.29.237.28>
	DocumentRoot /var/www/blog/
	ServerName mimvp.com
</VirtualHost>


# 把IP(115.29.237.28)访问定向到特定目录
<VirtualHost 115.29.237.28>
	DocumentRoot /var/www/deny/
	ServerName 115.29.237.28
</VirtualHost>

第一部分代码是实现拒绝直接通过 115.29.237.28 这个IP的任何访问请求,这时如果你用 115.29.237.28 访问,会跳转到拒绝页面,提示拒绝访问。

第二部分代码就是允许通过 blog.mimvp.com 这个域名访问,主目录指向 /var/www/blog/ (这里服务器OS是 CentOS)

第三部分代码是允许 mimvp.com 的顶级域名访问。

第四部分代码是把通过 115.29.237.28 这个IP的任何访问请求,定向到特定目录,放置一个自定义index.php页面,提示用户不让IP直接访问。

经过实测,以上方法并不可行,因为 httpd.conf 无法解析IP,因此需要换一种思路,最终成功解决方案请见下文

 

禁止通过 IP 访问网站

# deny access from ip
<VirtualHost *:80>
    ServerName 47.106.126.167
    <Location />
        Order Allow,Deny
        Deny from all
    </Location>
</VirtualHost>

修改实际不多,如红色字体,不指定具体IP,而是模糊匹配 VirtualHost *:80 

若是IP地址,则匹配到了 ServerName 47.106.126.167 ,然后禁止此IP访问

效果图如下图:

 

强制通过IP访问进行跳转 (推荐方案

# rewrite ip to domain
<VirtualHost *:80>
   
ServerName 47.106.126.167
    
    RewriteEngine on
    RewriteRule   ^(.*)  https://blog.mimvp.com [R=permanent,L]

</VirtualHost>

修改实际也不多,如红色字体,不指定具体IP,而是模糊匹配 VirtualHost *:80 

若是IP地址,则匹配到了 ServerName 47.106.126.167 ,然后进行强制重写跳转到 https://blog.mimvp.com

效果图如下图:

通过 IP 47.106.126.167 永久强制跳转到了 https://blog.mimvp.com 

至此,完美解决了通过IP访问,直接跳转到目标网址,IP转域名访问!

 

 

封禁某些IP访问/只允许某些IP访问网站

如果要控制禁止某些非法IP访问,在Directory选项控制: 

<Directory "/var/www">
#   Options Indexes FollowSymLinks
    Options FollowSymLinks		# 禁用Indexes,防止根目录泄露
    AllowOverride All

# Controls who can get stuff from this server.
    Order allow,deny
    Allow from all

	Deny from 10.0.0.1 			# 阻止一个IP 
	Deny from 192.168.0.0/24 	# 阻止一个IP段 
</Directory>


只允许某些IP访问,适合允许内部或者合作公司访问: 

<Directory "/var/www">
#   Options Indexes FollowSymLinks
    Options FollowSymLinks		# 禁用Indexes,防止根目录泄露
    AllowOverride All

# Controls who can get stuff from this server.
	Order deny,allow 
	Deny from all 

	Allow from example.com 				# 允许某个域名 
	Allow from 10.0.0.1 				# 允许一个iP 
	Allow from 10.0.0.1 10.0.0.2 		# 允许多个iP 
	Allow from 10.1.0.0/255.255.0.0 	# 允许一个IP段,掩码对 
	Allow from 10.0.1 192.168 			# 允许一个IP段,后面不填写 
	Allow from 192.168.0.0/24 			# 允许一个IP段,网络号
</Directory>

 

禁止或允许某些IP访问,也可以从外部文件引入

1) 添加引入文件到 httpd.conf 

Include block_ip_demo.con[f]
Include block_ip_blog.con[f]

 

2)把禁止或允许IP添加到配置文件

本文米扑博客以禁止IP访问为例

cat /etc/httpd/conf/block_ip_demo.conf 
 deny from  117.131.216.197
 deny from  119.44.13.93
 deny from  113.222.238.160

方法跟httpd.conf直接禁止IP类似,只是在禁止IP量很大(如1000个、10000个)时,引入一个外部的conf配置文件管理会更方便、简洁

 

配置好 httpd.conf 文件后,需要重启Apache,才能生效

/etc/init.d/httpd  restart

 

 

参考推荐

Apache设置禁止访问网站目录 (推荐

httpd使用ssl模块配置HTTPS

Nginx使用ssl模块配置HTTPS

Nginx Redirect重定向所有子域名到www

Apache 实现https+Apache http访问转到https

Apache 服务器负载低访问慢的原因分析和优化方案