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
如果没有什么错误的话,会在 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]