Apache的ReWrite的应用mod_rewrite模块使用(11)
来源:asp之家 发布时间:2010-04-04 18:44:00
标签:apache,mod_rewrite,url,rewrite,虚拟主机,服务器
从静态到动态
说明:
如何无缝转换静态页面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]
空闲时间内的内容协商
说明:
这是一个很难解的功能:动态生成的静态页面,即,它应该作为静态页面发送(从文件系统中读出,然后直接发出去),但是如果它丢失了,则由服务器动态生成。如此,可以静态地提供CGI生成的页面,除非有人(或者是一个cronjob)删除了这些静态页面,而且其内容可以得到更新。
方案:
以下规则集实现这个功能:
代码:
RewriteCond % !-s
RewriteRule ^page.html$ page.cgi [T=application/x-httpd-cgi,L]
这样,如果page.html不存在或者文件大小为null,则对page.html的请求会导致page.cgi的运行。其中奥妙在于,page.cgi是一个将输出写入page.html的(同时也写入STDOUT)的常规的CGI脚本,执行完毕,服务器则将page.html的内容发出。如果网管需要强制更新其内容,只须删除page.html即可(通常由一个cronjob完成)。
自动更新的文档
说明:
建立一个复杂的页面,能够在用编辑器写了一个更新的版本时自动在浏览器上得到刷新,这不是很好吗?这可能吗?
方案:
这是可行的! 这需要综合利用MIME多成分、网站服务器的NPH和mod_rewrite的URL操控特性。首先,建立一个新的URL特性:对在文件系统中更新时需要刷新的所有URL加上:refresh。
代码:
RewriteRule ^(/[uge]/[^/]+/?.*):refresh /internal/cgi/apache/nph-refresh?f=$1
然后,修改URL
代码:
/u/foo/bar/page.html:refresh
以内部地操控此URL
代码:
/internal/cgi/apache/nph-refresh?f=/u/foo/bar/page.html
接着就是NPH-CGI脚本部分了。虽然,人们常说"left as an exercise to the reader",我还是给出答案了。
代码:
#!/sw/bin/perl
##
## nph-refresh -- NPH/CGI script for auto refreshing pages
## Copyright (c) 1997 Ralf S. Engelschall, All Rights Reserved.
##
$| = 1;
# split the QUERY_STRING variable
@pairs = split(/&/, $ENV);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$name =~ tr/A-Z/a-z/;
$name = 'QS_' . $name;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
eval "$$name = "$value"";
}
$QS_s = 1 if ($QS_s eq '');
$QS_n = 3600 if ($QS_n eq '');
if ($QS_f eq '') {
print "HTTP/1.0 200 OKn";
print "Content-type: text/htmlnn";
print "&b&ERROR&/b&: No file givenn";
exit(0);
}
if (! -f $QS_f) {
print "HTTP/1.0 200 OKn";
print "Content-type: text/htmlnn";
print "&b&ERROR&/b&: File $QS_f not foundn";
exit(0);
}
sub print_http_headers_multipart_begin {
print "HTTP/1.0 200 OKn";
$bound = "ThisRandomString12345";
print "Content-type: multipart/x-mixed-replace;boundary=$boundn";
&print_http_headers_multipart_next;
}
sub print_http_headers_multipart_next {
print "n--$boundn";
}
sub print_http_headers_multipart_end {
print "n--$bound--n";
}
sub displayhtml {
local($buffer) = @_;
$len = length($buffer);
print "Content-type: text/htmln";
print "Content-length: $lennn";
print $buffer;
}
sub readfile {
local($file) = @_;
local(*FP, $size, $buffer, $bytes);
($x, $x, $x, $x, $x, $x, $x, $size) = stat($file);
$size = sprintf("%d", $size);
open(FP, "&$file");
$bytes = sysread(FP, $buffer, $size);
close(FP);
return $buffer;
}
$buffer = &readfile($QS_f);
&print_http_headers_multipart_begin;
&displayhtml($buffer);
sub mystat {
local($file) = $_[0];
local($time);
($x, $x, $x, $x, $x, $x, $x, $x, $x, $mtime) = stat($file);
return $mtime;
}
$mtimeL = &mystat($QS_f);
$mtime = $mtime;
for ($n = 0; $n & $QS_n; $n++) {
while (1) {
$mtime = &mystat($QS_f);
if ($mtime ne $mtimeL) {
$mtimeL = $mtime;
sleep(2);
$buffer = &readfile($QS_f);
&print_http_headers_multipart_next;
&displayhtml($buffer);
sleep(5);
$mtimeL = &mystat($QS_f);
last;
}
sleep($QS_s);
}
}
&print_http_headers_multipart_end;
exit(0);
##EOF##


猜你喜欢
- 事实上DNS不仅仅是用来解释地址用的而且还可以回答更多关於网路和主机的其它信息其中很重要的一个功能就是可以供邮件系统进行路由。这些资料通常会
- ##域名与网关项(Domain/Gateway).. Domain Name:为局域网的域名,在此为Company.mail,若无独立域名可
- 我发现不少使用z-blog博客程序的博主,把外链跳转的形式更改为http://域名/url.asp?url=http://www.***.n
- 很多朋友在用IIS6架网站的时候遇到不少问题, 以下是在所知的2003iis碰见的一些问题,只要对着症状处理。服务器一定可以使用的。问题1:
- 垂直搜索是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸,是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理
- 最近经常有同学在使用LAMP/WAMP时,遇到这样的编码错误问题: A网站程序编码UTF-8编码安装成功,运行成功。 B网站程序编gb231
- 只要你是站长做过网站,就一定对域名不陌生吧?很多站长为了寻觅一个满意的域名费尽心思,特别是发现自己想要的域名快要过期时,不知道什么时间可以再
- 1、勤奋:我是很建议这样做的,如果一件事你根本没花多少精力去做就成功了,那我只能说你是GOD,佩服!2、动脑:光有勤奋不够,必须在勤奋的基础
- 1、如何界定经营性和非经营性,有没有一个固定的规则?如果只是产品展示,是否应办理经营许可证?有偿提供服务的就是经营性的,无偿提供服务的就是非
- DNS MX记录一定要放在A记录之前,否则和邮件后缀相匹配的域名没有指向邮件服务器,很有可能邮件服务器收不到邮件。DNS MX记录一定要放在
- 本文将介绍Linux系统下查看显卡硬件信息内容如下:如何在ubuntu系统中查看显卡型号。(其他文章大多只介绍了命令而未介绍如何对应显卡型号
- 防复制的一个非常好的办法就是将文字替换为图片,汉字的数量非常庞大,总数大约九万左右,如果全部替换的话那先期工作将非常庞大,我们就要想其他的好
- 有用户问GoDaddy主机如何在共享主机帐户上使用Password Vault?其实这个问题很简单,Password Vault可以让你在一
- 现在网赚其实已经很流行了,但是多数学生只了解其表面,根本不懂其真实内容,记得原来我高中的时候看到有个网站上出现网赚这个词,是发展下线那种的,
- 使用VMware配置虚拟机静态IP地址,供大家参考,具体内容如下一、安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框
- 1、网站建设重设计轻应用建设企业网站是开展网络营销非常重要的一环。然而事实上,大部分企业网站都没有发挥出应有的网络营销作用。这跟企业对网站建
- 美联社CEO汤姆·库利(Tom Curley)北京时间11月13日晚间消息,据国外媒体报道,美联社CEO汤姆&
- 李开复(腾讯科技配图)“创新工场现在是房子不小,人不多,这个星期我们雇用了第七个人。”节前,李开复对
- DHCP概述1 采用DHCP的必要性在TCP/IP网络上,每台工作站要能存取网络上的资源之前,都必须进行基本的网络配置,一些主要参数诸如IP
- 10月16日消息,15日,身为电子商务教育界“黄埔军校”的阿里学院宣布,为帮助中小企业解决人才缺口问