我在CentOS上使用的是Apache Web服务器,我需要禁止人们通过在Web浏览器中使用服务器的IP地址来访问网站。 我想这样做,当有人试图浏览到IP地址,他们得到一个禁止的错误信息。
什么configuration将是必要的呢?
只需设置默认的虚拟主机。 在httpd.conf有一个注释示例,或者做一些小事:
<VirtualHost *:80> ServerName localhost DocumentRoot /var/www/html </VirtualHost>
您可以使用mod_rewrite(在.htaccess文件中,或在默认的服务器上下文中,或者在ServerName是主机的IP地址的单独的VirtualHost中)来实现此目的:
RewriteEngine On RewriteCond %{HTTP_HOST} 1.2.3.4 # Replace with your own IP address RewriteRule .* - [F]
这就是说,如果HTTP_HOST头匹配IP地址1.2.3.4,那么任何请求都应该满足403 Forbidden 。 任何具有另一个HTTP_HOST头的请求(例如,具有实际域名而不是IP地址的请求)都不应该受到影响。
您不能阻止通过IP的直接访问。 您必须允许连接,然后决定如何处理。 这可能会返回403,404或redirect到所需的页面。 你可以用mod_rewrite来做到这一点。
RewriteEngine On RewriteCond %{HTTP_HOST} ^123\.123\.123\.123 RewriteRule ^(.*)$ - [F,L]
这将匹配Web客户端传递的HTTP HOST头。 所有其他请求将通过。
但是,您可能需要将您的url标准化为SEO目的。
用这种方法你可以重写任何不符合要求的结果。
RewriteCond %{HTTP_HOST} !^fully\.qualified\.domain\.name [NC] RewriteCond %{HTTP_HOST} !^$ RewriteCond %{SERVER_PORT} !^80$ RewriteRule ^/(.*) http://fully.qualified.domain.name:%{SERVER_PORT}/$1 [L,R]
参考: https : //httpd.apache.org/docs/2.0/rewrite/rewrite_guide.html#canonicalurl
参考: http : //en.wikipedia.org/wiki/URL_normalization
此解决scheme不包括所有情况。
将IP URL中的任何数字或点replace为%##(例如1%31 … 8%38),您将到达IP,而不是域url。
假设这个不好的IP,用来缓解解释:123.45.6.789
您必须使用所有数字和点的2个替代品:点是%2E和0..9是%30 ..%39
RewriteEngine on RewriteCond %{HTTP_HOST} (1|%31)(2|%32)(3|%33)(\.|%2E)(4|%34)(5%35)(\.|%2E)(6|%36)(\.|%2E)(7|%37)(8|%38)(9|%39) RewriteRule . - [F]
丑陋,它可以减less{1,3},并限制到有效的知识产权,但它是为你的知识产权,没有必要这样做。
不要忘记像“:80”这样的端口。 HTTP_HOST包含它并且SERVER_NAME不可靠。