学习Apache

作者:夏武

简介

架构

安装

第一步,从这里下载Apache。

第二步,解压缩下载的Apache文件。这里我们下载的文件名假定为httpd-2.2.6.tar.gz。

tar xvfz httpd-2.2.6.tar.gz
	 

第三步,编译和安装。这里我们将mod_rewrite模块通过DSO机制在运行时动态加载, apache被安装在$PREFIX(比如/usr/local)下面。

cd httpd-2.2.6
./configure --prefix=$PREFIX --enable-rewrite=shared
make 
make install
		  
最后,测试一下apache。
$PREFIX/bin/apachectl -k start
	 

访问一下,看一下localhost可以看到apache的默认页面。

配置mod_rewrite模块

介绍

此模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。 此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

标准URL重定向

比如,我们要将/~tom重定向到/u/tom,可以利用标准URL重定向。

RewriteRule   ^/~([^/]+)/?(.*)    /u/$1/$2  [R]
	 

标准主机名重定向

比如,将强制用户使用www.example.com代替exaple.com。

RewriteCond %{HTTP_HOST}   !^fully\.qualified\.domain\.name [NC] 
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^/(.*) http://fully.qualified.domain.name/$1 [L,R]

改变DocumentRoot

比如将指向/重定向到/about。

RewriteEngine on 
RewriteRule   ^/$  /about/  [R] 
	 

重定向到不同的WEB服务器

比如,将/~user/重定向到http://newserver/~user/。

RewriteEngine on 
RewriteRule   ^/~(.+)  http://newserver/~$1  [R,L]
	 

如何用重定向实现虚拟用户主机

比如我们要实现这样的一个域名www.username.host.domain.com(这点对于zeuux自由网站系统有用)。

RewriteEngine on 
RewriteCond   %{HTTP_HOST}                 ^www\.[^.]+\.host\.com$ 
RewriteRule   ^(.+)                        %{HTTP_HOST}$1          [C] 
RewriteRule   ^www\.([^.]+)\.host\.com(.*) /home/$1$2 
	   

基于时间的重定向

比如我们要实现一个这样的功能,对于晚上和白天提供不同风格的网页,可以这样做。

RewriteEngine on
RewriteCond   %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond   %{TIME_HOUR}%{TIME_MIN} <1900 
RewriteRule   ^index\.html$             index.day.html 
RewriteRule   ^index\.html$             index.night.htm 
	   

禁止网络爬虫的访问

很多网络爬虫不遵守在/robots.txt文件中定义的"Robot Exclusion Protocol", 可以禁掉。 不如我们要保护/private/memeber

RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*
RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$ 
RewriteRule ^/private/memeber/.+   -   [F] 
	 

通过外部程序或者文件重定向

如果mod_rewrite不满足你的要求,可以通过外部程序扩展。例如,

RewriteEngine on 
RewriteMap    zeuux-map       prg:/home/zeuux/map.zeuux.pl 
RewriteRule   ^/~zeuux/(.*)$  /~zeuux/${zeuux-map:$1}
	   
#!/path/to/perl 

#   disable buffered I/O which would lead
#   to deadloops for the Apache server 
$| = 1;
	   
#   read URLs one per line from stdin and 
#   generate substitution URL on stdout 
while (<>>) { 
	s|^foo/|bar/|; 
	print $_; 
} 
	 

配置缓存模块

配置Apache的身份认证

修改httpd.conf文件,确保有如下项:

	   # AccessFileName: The name of the file to look for in each directory 
# for access control information.
#
AccessFileName .htaccess
# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
# CGI directory exists, if you have that configured.
#

AllowOverride AuthConfig
Options None
Order allow,deny
Allow from all

第一项说明,用于身份认证的文件名是.htaccess,第二项是对你要限制的目录进行相应的配置,例子里是要限制cgi-bin目录的访问。 修改httpd.conf文件以后,需要重新启动httpd守护进程,才能使配置生效。命令如下:

apachectl restart
	 

在/etc目录下,使用htpasswd命令建立password文件:

htpasswd -c htpasswd root
	   

然后在待限制的目录里(cgi-bin)建立.htaccess文件,内容如下:

AuthUserFile /etc/htpasswd 
AuthName "zeuux.org Auth" 
AuthType Basic 
Require valid-user
	 

此时,已经建立了对cgi-bin目录的WEB访问,即此时再通过WEB访问该目录内的内容时,需要如下的认证:

用户:root

口令:xxx

―――――――――――――――――――――――――――――――――――――――

设定apache的URL访问控制功能:

在httpd.conf里做如下的设定:

		 < Location /cgi-bin/cvsweb.cgi/ns210402/src/kernel> 
		   Order deny,allow 
		   Deny from all 
		   Allow from 10.1.2.30 10.1.2.91 10.1.2.230 10.1.2.15 
		 </Location>
	   

经过上面的设定,/cgi-bin/cvsweb.cgi/ns210402/src/kernel目录(WEB宿主目录)只能由上述几个IP地址访问。实现了基于URL的安全功能。

FastCGI配置