mod_rewrite使用总结前提需求: modrewite 将URL定向到另一个目录或文件,而地址栏URL不变,网页内容为新地址内容。http://www.test.com/a/b 显示 http://www.test.com/test/的内容,URL地址还保持为www.test.com/a/b根据下面操作自己可以更加灵活变动参考连接http://fanqiang.chinaunix.net/a6/b1/20010905/0800001238.html一、实现原理: (主要看第2点) 只有当用户的WEB请求最终被导向到某台WEB服务器的Apache后台,则这台WEB服务器接受 进来的请求,根据配置文件该请求是主配置还是虚拟主机,再根据用户在浏览器中请求的 URI来配对重写规则并且根据实际的请求路径配对.htaccess中的重写规则。最后把请求 的内容传回给用户,该响应可能有两种: 1) 对浏览器请求内容的外部重定向(Redirect)到另一个URL。 让浏览器再次以新的URI发出请求(R=301或者R=302,临时的或是永久的重定向) 如:一个网站有正规的URL和别名URL,对别名URL进行重定向到正规URL,或者网站改换 成了新的域名 则把旧的域名重定向到新的域名(Redirect) 2) 也可能是由Apache内部子请求代理产生新的内容送回给客户[P,L] 这是Apache内部根据重写后的URI内部通过代理模块请求内容并送回内容给客户,而客户 端浏览器并 不知道,浏览器中的URI不会被重写。但实际内容被Apache根据重写规则后的URI得到。 如:在公司防火墙上运行的Apache启动这种代理重写规则,代理对内部网段上的WEB服务 器的请求。 说明:为了不让地址URL被重写,而内容重定向,使用apache mod_proxy代理模块的反向代理功能实现。二、简单说一下mod_proxyApache可以被配置为正向(forward)和反向(reverse)代理。正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。正向代理的典型用途是为在防火墙内的局域网客户端提供访问Internet的途径。正向代理还可以使用缓冲特性(由mod_cache提供)减少网络使用率。使用ProxyRequests指令即可激活正向代理。因为正向代理允许客户端通过它访问任意网站并且隐藏客户端自身,因此你必须采取安全措施以确保仅为经过授权的客户端提供服务。反向代理正好相反,对于客户端而言它就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的名字空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端,就像这些内容原本就是它自己的一样。反向代理的典型用途是将防火墙后面的服务器提供给Internet用户访问。反向代理还可以为后端的多台服务器提供负载平衡,或为后端较慢的服务器提供缓冲服务。另外,还可以启用高级URL策略和管理技术,从而使处于不同web服务器系统的web页面同时存在于同一个URL空间下。可以使用ProxyPass指令激活反向代理(在RewriteRule指令中使用[P]标记也可以)。配置反向代理并不需要打开ProxyRequests指令。简单示例:正向代理ProxyRequests OnProxyVia On<Proxy *>Order deny,allowDeny from allAllow from internal.example.com</Proxy> 反向代理ProxyRequests Off<Proxy *>Order deny,allowAllow from all</Proxy>ProxyPass /foo http://foo.example.com/barProxyPassReverse /foo http://foo.example.com/bar
三、mod_rewrite的具体使用方法,我在这里就不多说了,请看这个链接:http://bbs.chinaunix.net/viewthread.php?tid=66521&extra=page%3D2四、开始安装!!!!!!仔细看上面理论说明,具体操作没有几步的,越来越觉得理论基础非常重要!!!1、安装apache2.0cd apache2.0./configure --enable-MODULE=shared --enable-so --with-mpm=worker --enable-rewrite=shared --enable-proxy=shared说明:--enable-proxy=shared 加入mod_proxy模块--enable-rewrite=shared 加入mod_rewrite模块对于编译mod_rewrite模块,我多说几句:按照上面的方法,rewrite模块已经正常编译进了./apache2/module/目录里了,而且配置文件LoadModule也添加相关路径了,可是我使用时rewrite却不能重写,所以我又手动添加了一次,这个方法同样也适合不想重新安装apache,采用手动添加的方法。
cd 源代码目录find ./ -name mod_rewrite.c cd PATH/to/mod_rewrite.c/usr/local/apache2/bin/apxs -c mod_rewrite.c /usr/local/apache2/bin/apxs -i -a -n mod_rewrite mod_rewrite.la 如果出现这个错误Syntax error on line 329 of /usr/local/apache2/conf/httpd.conf:Can`t loacte API module staructure `mod_rewrite_module` in file /usr/local/apache2/modules/mod_rewrite.so:/usr/local/apache2/lib/libapr-0.so.0:undefined symbol:mod_rewrite_module修改http.conf 原来:httpd.conf里面写的mod_rewrite_module改成 rewrite_module 如果重启apache出现这个错误module rewrite_module is built-in and can`t be loaded表示模块是内建的,不用再调入结束。2、修改配置文件vi conf/httpd.conf添加下面内容:<Proxy *>Order deny,allowAllow from all</Proxy>启用mod_proxy反向代理NameVirtualHost 192.168.0.203:80<VirtualHost 192.168.0.203:80> ServerAdmin test@test.com DocumentRoot /test ServerName www.test.com ErrorLog logs/ip-error_logRewriteEngine onRewriteCond %{REQUEST_URI} /[^&]+/b/RewriteCond %{REQUEST_URI} !/test/RewriteCond %{HTTP_HOST} ^www/.test/.com [NC]RewriteRule ^/(.*) http://www.test.com/test/ [P,L]</VirtualHost>这几个条件和规则的意思是:如果输入www.test.com ([^&]+表示任意字符)并且后面的URI为a/b/形式,则跳到www.test.com/test/ 如果输入的是www.test.com/test/则不跳转。[P]这个参数很重要,使用反向代理方式应该用户请求。经过上面这几步,就是可以实现前面的需求。
下面为使用实例:1、RewriteCond %{THE_REQUEST} ^[^/]+/[^&^/]+/blog[^/?]*/ HTTP/ RewriteCond %{HTTP_HOST} ^www/.test/.com [NC] (这个条件不加也可以,如果不限制主机名)RewriteRule ^(.*)/(.*)/blog([^/?]*) $1/space/blog$3?username=$2 [L,R]2、RewriteCond %{REQUEST_URI} ^/[^&^/]+/blogRewriteCond %{REQUEST_URI} !/space/blog/RewriteCond %{HTTP_HOST} ^www/.203wdxc/.cn [NC]RewriteRule ^(.*)/([a-z]+)/blog(.*) $1/space/blog$3?username=$2 [P,L]3、RewriteCond %{REQUEST_URI} /[^&]+/blog/RewriteCond %{REQUEST_URI} !/space/blog/RewriteCond %{HTTP_HOST} ^www/.test/.cn [NC]RewriteRule ^/(.*) http://www.test.cn/space/ [P,L]http://www.test.cn/name/blog 跳到http://www.test.cn/space/ 如果是/space/blog/不跳转5、http://www.example.com/swf/test.swf?member_name=finalbsd&album_id=24重写成:http://www.example.com/swf/finalbsd/24/test.swfRewriteCond %{THE_REQUEST} ^[A-Z]{3,9}/ /swf/([^&]+)/.swf/?member_name=([^&]+)&album_id=([^&]+)/ HTTP/RewriteRule ^/swf/([^&]+)/.swf$ http://www.example.com/swf/%2/%3/%1.swf? [R]6、RewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog/ HTTPRewriteRule ^(.*)/(.*)/blog $1/space/blog?username=$2 [L,R]RewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog// HTTPRewriteRule ^(.*)/(.*)/blog/ $1/space/blog/?username=$2 [L,R]RewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog/[^/?]*/ HTTPRewriteRule ^(.*)/(.*)/blog/([^/?]*) $1/space/blog/$3?username=$2 [L,R]7、#三种情况,所以写了三个条件三个规则RewriteCond %{REQUEST_URI} !/space/blogRewriteCond %{THE_REQUEST} ^GET/ /[^/]+/blog/ HTTPRewriteRule ^(.*)/(.*)/blog $1/space/blog?username=$2 [L,R]RewriteCond %{REQUEST_URI} !/space/blog/RewriteCond %{THE_REQUEST} ^GET/ /[^/]+/blog// HTTPRewriteRule ^(.*)/(.*)/blog/ $1/space/blog/?username=$2 [L,R]RewriteCond %{REQUEST_URI} !/space/blog/[^/?]*RewriteCond %{THE_REQUEST} ^GET/ /[^/]+/blog/[^/?]*/ HTTPRewriteRule ^(.*)/(.*)/blog/([^/?]*) $1/space/blog/$3?username=$2 [L,R]8、9.RewriteCond %{REQUEST_URI} !/[a-z]+/.* RewriteCond %{HTTP_HOST} ^[^&]+/.blog/.test/.com [NC]RewriteRule ^/(.*)$ $2/a/b/$1 [L,R]解释一下:前两句就是定义条件,如果任意一个这样的地址http://user1.blog.test.com 后面没有子路径时,才执行第三句的重写规则,重写为http://user1.test.com/a/b 而对于http://user1.blog.test.com/photo 不进行重写. 10、<Proxy *>Order deny,allowAllow from all</Proxy>NameVirtualHost 192.168.0.191:80<VirtualHost 192.168.0.191:80> DocumentRoot /test ServerName www.test.cn RewriteEngine onRewriteCond %{REQUEST_URI} !/space/blogRewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog/ HTTPRewriteRule ^(.*)/(.*)/blog $1/space/blog/?username=$2 [P,L]RewriteCond %{REQUEST_URI} !/space/blog/RewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog// HTTPRewriteRule ^(.*)/(.*)/blog/ $1/space/blog/?username=$2 [P,L]RewriteCond %{REQUEST_URI} !/space/blog/[^/?]*RewriteCond %{THE_REQUEST} ^[^/]+/[^/]+/blog/[^/?]*/ HTTPRewriteRule ^(.*)/(.*)/blog/([^/?]*) $1/space/blog/$3?username=$2 [P,L]</VirtualHost>http://www.test.com/name/blog 跳到 http://www.test.com/space/blog?username=name 但是地址不发生变化,因为使用了[P]代理请求。11、RewriteCond %{HTTP_HOST} ^(.*).aaaa/.cn [NC]RewriteRule ^(.*)$ http://%1.vvvv.cn/$1 [R=permanent,L] RewriteCond %{REQUEST_URI} !^/space/blog/.*RewriteCond %{HTTP_HOST} ^[^&]+/.blog/.aaa/.cn [NC]RewriteCond %{THE_REQUEST} !^[^&]/.*/ HTTP/ [NC]RewriteRule ^/(.*)$ $2/space/blog/$1 [L,R] RewriteCond %{REQUEST_URI} !/[a-z]+/.* #{REQUEST_URI}的意思是这是在HTTP请求行中所请求的资源(比如"/index.html"或/test/test.html), [^&]表示里面是任意字符,^表示行首第一个字符,&表示行尾字符, !表示否的意思或不包括的意思,+ 表示它前面的那个字符出现大于零的个数,.表示单个任意字符,*表示前面字符出现任意个,也可以一次也不出现,RewriteCond 表示条件。整句的意思就是:设定一个条件为,不包括一个请求资源的子路径(/test/test.html)为任何资源,而不是URL,再说的直白一点,就是输入了一个地址http://www.test.com后面没有输入/test/test.html等形式的地址情况下。再看下面就这句就会更加明白。RewriteCond %{HTTP_HOST} ^[^&]+/.blog/.191wdxc/.cn [NC]{HTTP_HOST}意思是请求的是一个完整FQDN形式的地址,就是www.test.com, [NC]表示忽略大小字母。第一句和第二句合起来理解就是,设定了条件,一个请求地址是[^&].blog.aaa.cn并且后没有输入子路径时才可以执行下面的规则。如果不满足这个条件的,就不进行rewrite.RewriteRule ^/(.*)$ $2/space/blog/$1 [L,R]这句就是重写规则了。$2表示使用了反向引用,(.*)这部分内容,就是用$2引用,$就是用$1引用,这样重写之后就是这样http://[^&].blog.aaa.cn/space/blog
本文来自博客,转载请标明出处:http://blog.csdn.net/paulluo0739/archive/2009/04/21/4097974.aspx