`

Apache 配置 Rewrite, 顺便记录下编译添加新模块

阅读更多

Apache 1.x 的用户请检查 conf/httpd.conf 中是否存在如下两段代码:


清单 1. Apache 1.x 的加载模块代码

				 
 LoadModule rewrite_module libexec/mod_rewrite.so 
	 AddModule mod_rewrite.c 

 

Apache 2.x 的用户请检查 conf/httpd.conf 中是否存在如下一段代码:


清单 2. Apache 2.x 的加载模块代码

				 
 LoadModule rewrite_module modules/mod_rewrite.so 

 

如果存在,那么在配置文件(通常就是 conf/httpd.conf)中加入如下代码。此时请务必注意,如果网站使用通过虚拟主机来定义,请务必加到虚拟主机配置,即 <VirtualHost> 中去,如果加在虚拟主机配置外部将可能无法使用,改好后将 Apache 重启。稍后再解释这段代码的意思


清单 3. 加入配置文件的代码

				 
 LoadModule rewrite_module     modules/mod_rewrite.so 
	 <IfModule rewrite_module> 
 RewriteEngine on 
 RedirectMatch ^(.*)/([^/]*)\.com$ $1/index.jsp?brand=$2 
	 </IfModule> 

 

如果没有加载这个 mod_rewrite 模块,那多半就是 Apache 本身编译的时候就没有编译上 rewrite 模块了,那我们需要手工自己编译一下这个模块。

先找到你的 Apache 最初编译的源代码目录,找到放 mod_rewrite.c 的目录,例如 :/usr/local/src/httpd-2.2.13/modules/mappers, 然后使用 Apache 安装好的 apxs 命令编译即可:


清单 4. 指向源代码目录的代码

				 
 /usr/local/apache2/bin/apxs -i -a -c ./mod_rewrite.c 

 

编译的过程如下:


清单 5. 编译过程的代码

				 
 /usr/local/apache2/build/libtool --silent --mode=compile gcc -prefer-pic 
  -DAP_HAVE_DESIGNATED_INITIALIZER -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -g -O2 -pthread 
 -I/usr/local/apache2/include  -I/usr/local/apache2/include 
  -I/usr/local/apache2/include  -c -o ./mod_rewrite.lo 
 ./mod_rewrite.c && touch ./mod_rewrite.slo 
 /usr/local/apache2/build/libtool --silent --mode=link gcc -o ./mod_rewrite.la 
  -rpath /usr/local/apache2/modules -module -avoid-version   
  ./mod_rewrite.lo 
 /usr/local/apache2/build/instdso.sh SH_LIBTOOL='/usr/local/apache2/build/libtool'
  ./mod_rewrite.la /usr/local/apache2/modules 
 /usr/local/apache2/build/libtool 
 --mode=install cp ./mod_rewrite.la /usr/local/apache2/modules/ 
 cp ./.libs/mod_rewrite.so /usr/local/apache2/modules/mod_rewrite.so 
 cp ./.libs/mod_rewrite.lai /usr/local/apache2/modules/mod_rewrite.la 
 cp ./.libs/mod_rewrite.a /usr/local/apache2/modules/mod_rewrite.a 
 chmod 644 /usr/local/apache2/modules/mod_rewrite.a 
 ranlib /usr/local/apache2/modules/mod_rewrite.a 
 PATH="$PATH:/sbin" ldconfig -n /usr/local/apache2/modules 
 ---------------------------------------------------------------------- 
 Libraries have been installed in: 
   /usr/local/apache2/modules 

 If you ever happen to want to link against installed libraries 
 in a given directory, LIBDIR, you must either use libtool, and 
 specify the full pathname of the library, or use the `-LLIBDIR'
 flag during linking and do at least one of the following: 
   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable 
     during execution 
   - add LIBDIR to the `LD_RUN_PATH' environment variable 
     during linking 
   - use the `-Wl,--rpath -Wl,LIBDIR' linker flag 
   - have your system administrator add LIBDIR to `/etc/ld.so.conf'

 See any operating system documentation about shared libraries for 
 more information, such as the ld(1) and ld.so(8) manual pages. 
 ---------------------------------------------------------------------- 
 chmod 755 /usr/local/apache2/modules/mod_rewrite.so 
 [activating module `rewrite' in /usr/local/apache2/conf/httpd.conf] 

 

如果没有什么错误的话,会在 apache/modules 目录中编译出一个 mod_rewrite.so 文件。
同时 apxs 应该会自动编译并且部署到你的 Apache 目录,会在
vi /usr/local/apache2/conf/httpd.conf 里加载:
LoadModule rewrite_module    modules/mod_rewrite.so

如果没有部署,你将 mod_rewrite.so 手工拷贝到的 Apache modules 目录下并且修改 httpd.conf 进行加载即可,例如:/usr/local/apache2/modules

2. 接下来就可以用 rewrite 来将不同的访问 URL 参数化来处理了。Rewrite module 可以用一个正则表达式来匹配用户发送过来的 URL 请求,然后转换成另外一种形式的 URL 请求,然后再交给 Apache 去分发和处理修改后的 URL 页面请求。

我们在 Apache 的 httpd.conf 里加入以下的 code 就可以达到这样的效果。


清单 6. URL 转换的代码

				 
 LoadModule rewrite_module     modules/mod_rewrite.so 
 <IfModule rewrite_module> 
		 RewriteEngine on 
		 RedirectMatch ^(.*)/([^/]*)\.com$ $1/index.jsp?brand=$2 
      </IfModule> 

 

熟悉正则表达式的读者,可以看到例子中的 RedirectMatch 后面跟的正则表达式会匹配 http://www.CRL.com/mycompany.com 然后转换为 http://www.CRL.com/index.jsp?brand=mycompany


图 1. 流程图
图 1. 流程图

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics