登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

SeaRiver Blog

实力才是你一生最好的依靠!

 
 
 

日志

 
 

初级URL重写指南  

2009-07-06 14:43:51|  分类: apache |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

中国站长站站长书库模块索引指令索引常见问题词汇表站点导航

Apache HTTP Server 版本2.2

<-
站长书库在线文档Apache 2.2 在线文档URL重写

初级URL重写指南

本文是mod_rewrite参考文档的补充材料。阐述在实际应用中如何解决网管所面临的基于URL的典型问题,并详细描述了如何配置URL重写规则集以解决这些问题。

注意:根据你的服务器配置,有可能必须对这里的例子作些小修改,比如,在额外启用mod_aliasmod_userdir的情况下要增加[PT]标志,或者为了适应目录级(.htaccess)的配置而将针对服务器级的规则集进行重写。对一个特定的规则集应该先透彻理解然后再考虑应用,这样才能避免出现问题。
top
top
top

DocumentRoot

描述:
通常,web服务器的DocumentRoot直接对应于URL"/",但是它常常不是处于最高的一级。比如,你希望访问者在进入网站时首先进入/about/目录。可以使用下面给出的规则集。
解决方案:
只需将"/"重定向到"/about/"即可:
RewriteEngine on  RewriteRule   ^/$  /about/  [R]  

也可以使用RedirectMatch指令解决问题:

RedirectMatch ^/$ http://example.com/e/www/

top

描述:
每个网管对引用目录的结尾斜杠问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是"/~quux/foo"而不是"/~quux/foo/",服务器就会去找一个叫foo的文件,而它是一个目录,所以就报错了。通常,可以使用这个FAQ entry里面提到的方法解决问题。但是有时候需要使用重写规则来解决问题,比如,在应用了许多复杂的重写规则之后。
解决方案:
解决这个微妙问题的方案是让服务器自动添加后缀斜杠。为了达到目的,必须使用一个外部重定向,以使浏览器能够正确地处理后继的请求(比如对图片的请求)。如果仅仅执行一个内部重写,可能仅仅对目录页面有效,而对含有相对URL的图片的页面无效,因为浏览器有请求内嵌目标的可能。比如,如果不用外部重定向,对/~quux/foo/index.html页面中的image.gif的请求将变成对/~quux/image.gif的请求!所以,应该这样写:
RewriteEngine  on  RewriteBase    /~quux/  RewriteRule    ^foo$  foo/  [R]  

又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中:

RewriteEngine  on  RewriteBase    /~quux/  RewriteCond    %{REQUEST_FILENAME}  -d  RewriteRule    ^(.+[^/])$           $1/  [R]  

但是这样一来会增加处理上的开销。

top
top
top
top
top
top
top

依赖于时间的重写

描述:
在页面内容需要按时间的不同而变化的场合,比如重定向特定页面等,许多网管仍然采用CGI脚本的方法,如何用mod_rewrite来实现呢?
解决方案:
有许多名为TIME_xxx的变量可以用在重写条件中,联合使用词典模式的"<STRING", "=STRING", ">STRING"比较,就可以实现依赖于时间的重写:

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

此例使foo.html07:00-19:00时间内指向foo.day.html,而在其余时间指向foo.night.html,对主页是一个不错的功能...

top

对YYYY转变为XXXX的向前兼容

描述:
在转变了大批document.YYYY文件为document.XXXX后(比如.html.phtml),如何保持URL的向前兼容(仍然虚拟地存在)?
解决方案:
只须按基准文件名重写,并测试带有新的扩展名的文件是否存在,如果存在则用新的,否则仍然用原来的。

# 将document.html重写为document.phtml的向后兼容的规则集  # 当且仅当document.phtml存在且document.html不存在的时候  RewriteEngine on  RewriteBase   /~quux/  # 剪切并记住basename  RewriteRule   ^(.*)\.html$              $1      [C,E=WasHTML:yes]  # 如果存在的话就重写为document.phtml  RewriteCond   %{REQUEST_FILENAME}.phtml -f  RewriteRule   ^(.*)$ $1.phtml                   [S=1]  # 否则返回先前的basename  RewriteCond   %{ENV:WasHTML}            ^yes$  RewriteRule   ^(.*)$ $1.html  
top

从旧到新(内部)

描述:
假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,即让用户仍然可以使用老的URL,而感觉不到文件被改名了。
解决方案:
通过以下规则内部地将老的URL重写为新的:
RewriteEngine  on  RewriteBase    /~quux/  RewriteRule    ^foo\.html$  bar.html  

从旧到新(外部)

描述:
仍然假定已经把文件foo.html改名为bar.html,需要对老的URL向后兼容,但是要让用户得到文件被改名的暗示,即浏览器的地址栏中显示的是新的URL。
解决方案:
作一个HTTP的强制重定向以改变浏览器和用户界面上的显示:
RewriteEngine  on  RewriteBase    /~quux/  RewriteRule    ^foo\.html$  bar.html  [R]  

从静态到动态

描述:
如何无缝转换静态页面foo.html为动态的foo.cgi,而不为浏览器/用户所察觉。
解决方案:
只须重写此URL为CGI-script,并强制作为CGI-script运行的MIME类型。比如对/~quux/foo.html的请求会执行/~quux/foo.cgi
RewriteEngine  on  RewriteBase    /~quux/  RewriteRule    ^foo\.html$  foo.cgi  [T=application/x-httpd-cgi]  

top

阻止Robot

描述:
如何阻止一个完全匿名的Robot取得特定网络区域的页面?/robots.txt文件可以包含若干"Robot排除协议"行,但不足以阻止此类Robot。
解决方案:
可以用一个规则集以拒绝对网络区域/~quux/foo/arc/(对一个很深的目录区域进行列表可能会使服务器产生很大的负载)的访问。还必须确保仅阻止特定的Robot,也就是说,仅仅阻止Robot访问主机是不够的(这样会同时阻止用户访问该主机)。为此,就需要对HTTP头的User-Agent信息作匹配。
RewriteCond %{HTTP_USER_AGENT}   ^NameOfBadRobot.*  RewriteCond %{REMOTE_ADDR}       ^123\.45\.67\.[8-9]$  RewriteRule ^/~quux/foo/arc/.+   -   [F]  

阻止内嵌的图片

描述:
假设http://www.quux-corp.de/~quux/有一些内嵌GIF图片的页面,这些图片很好,所以就有人盗链到他们自己的页面中了。由于这样徒然增加了我们服务器的流量,因此,我们不愿意这种事情发生。
解决方案:
虽然,我们不能100%地保护这些图片不被写入别人的页面,但至少可以对发出HTTP Referer头的浏览器加以限制。
RewriteCond %{HTTP_REFERER} !^$  RewriteCond %{HTTP_REFERER} !^http://www.quux-corp.de/~quux/.*$ [NC]  RewriteRule .*\.gif$        -                                    [F]  
RewriteCond %{HTTP_REFERER}         !^$  RewriteCond %{HTTP_REFERER}         !.*/foo-with-gif\.html$  RewriteRule ^inlined-in-foo\.gif$   -                        [F]  

拒绝代理

描述:
如何拒绝某个主机或者来自特定主机的用户使用Apache代理?
解决方案:
首先,要确保在配置文件中mod_rewrite位于mod_proxy之后!使它在mod_proxy之前被调用。然后,使用如下方法拒绝某个主机:
RewriteCond %{REMOTE_HOST} ^badhost\.mydomain\.com$  RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]  

使用如下方法拒绝user@host-dependent用户:

RewriteCond %{REMOTE_IDENT}@%{REMOTE_HOST}  ^badguy@badhost\.mydomain\.com$  RewriteRule !^http://[^/.]\.mydomain.com.*  - [F]  

top

外部重写引擎

描述:
如何解决似乎无法用mod_rewrite解决的FOO/BAR/QUUX/之类的问题?
解决方案:
可以使用一个与RewriteMap功能相同的外部RewriteMap程序,一旦它在Apache启动时被执行,则从STDIN接收被请求的URL ,并将处理过(通常是重写过的)的URL(以相同顺序)在STDOUT输出。
RewriteEngine on  RewriteMap    quux-map       prg:/path/to/map.quux.pl  RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}  
#!/path/to/perl    # 禁止使用会导致Apache陷入死循环的I/O缓冲  $| = 1;    # 从stdin读取URL(每行一个),并在stdout输出替换URL  while (<>) {      s|^foo/|bar/|;      print $_;  }  
这是只是一个简单的示例,只是把所有的/~quux/foo/...重写为/~quux/bar/...而已。但事实上,可以把它修改成任何你想要的输出。但是要注意,虽然一般用户都可以使用,可是只有系统管理员才可以定义这样的映射。

本文允许自由使用、分发、转载,但必须保留译者署名;详见:译者声明

中国站长站站长书库模块索引指令索引常见问题词汇表站点导航

 

原地址: http://book.chinaz.com/docs/apache/2_2/rewrite/rewrite_guide.html

  评论这张
 
阅读(547)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018