Apache伪静态资料.docx

上传人:b****6 文档编号:7107593 上传时间:2023-01-18 格式:DOCX 页数:34 大小:39.45KB
下载 相关 举报
Apache伪静态资料.docx_第1页
第1页 / 共34页
Apache伪静态资料.docx_第2页
第2页 / 共34页
Apache伪静态资料.docx_第3页
第3页 / 共34页
Apache伪静态资料.docx_第4页
第4页 / 共34页
Apache伪静态资料.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

Apache伪静态资料.docx

《Apache伪静态资料.docx》由会员分享,可在线阅读,更多相关《Apache伪静态资料.docx(34页珍藏版)》请在冰豆网上搜索。

Apache伪静态资料.docx

Apache伪静态资料伪静态资料Apache伪静态资料Apache模块mod_rewrite说明一个基于一定规则的实时重写URL请求的引擎状态扩展(E)模块名rewrite_module源文件mod_rewrite.c兼容性仅在Apache1.3及以后的版本中可用概述此模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。

它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。

此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。

此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(.htaccess)配置都有效,还可以生成最终请求字符串。

此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。

但是,所有这些功能和灵活性带来一个问题,那就是复杂性,因此,不要指望一天之内就能看懂整个模块。

更多的讨论、细节、示例,请查看详细的URL重写文档。

特殊字符的引用在Apache1.3.20中,TestString和Substitution中的特殊字符可以用前导斜杠(/)来实现转义(即忽略其特殊含义而视之为普通字符)。

比如,Substitution可以用/$来包含一个美元符号,以避免mod_rewrite把它视为反向引用。

环境变量此模块会跟踪两个额外的(非标准)CGI/SSI环境变量,SCRIPT_URL和SCRIPT_URI。

他们包含了当前资源的逻辑网络视图,而标准CGI/SSI变量SCRIPT_NAME和SCRIPT_FILENAME包含的是物理系统视图。

注意:

这些变量保持的是其最初被请求时的URI/URL,即在任何重写操作之前的URI/URL。

其重要性在于他们是重写操作重写URL到物理路径名的原始依据。

示例SCRIPT_NAME=/sw/lib/w3s/tree/global/u/rse/.www/index.htmlSCRIPT_FILENAME=/u/rse/.www/index.htmlSCRIPT_URL=/u/rse/SCRIPT_URI=http:

/我们提供了URL重写指南和高级URL重写指南文档,列举了许多基于URL的问题的实用方案,其中你可以找到真实有用的规则集。

RewriteBase指令说明设置目录级重写的基准URL语法RewriteBaseURL-path默认值参见使用方法作用域directory,.htaccess覆盖项FileInfo状态扩展(E)模块mod_rewriteRewriteBase指令显式地设置了目录级重写的基准URL。

在下文中,你将看到RewriteRule可以用于目录级的配置文件中(.htaccess)并在局部范围内起作用,即规则实际处理的只是剥离了本地路径前缀的一部分。

处理结束后,这个路径会被自动地附着回去。

默认值是RewriteBasephysical-directory-path。

在对一个新的URL进行替换时,此模块必须把这个URL重新注入到服务器处理中。

为此,它必须知道其对应的URL前缀或者说URL基准。

通常,此前缀就是对应的文件路径。

但是,大多数网站URL不是直接对应于其物理文件路径的,因而一般不能做这样的假定!

所以在这种情况下,就必须用RewriteBase指令来指定正确的URL前缀。

如果你的网站服务器URL不是与物理文件路径直接对应的,你必须在每个使用RewriteRule的.htaccess文件中使用RewriteBase指令。

例如,目录级配置文件内容如下:

#/abc/def/.htaccess-/abc/def目录的配置文件#注意:

/abc/def是/xyz的物理路径(例如存在一条Alias/xyz/abc/def指令)。

RewriteEngineOn#让服务器知道我们使用的是/xyz而不是物理路径/abc/defRewriteBase/xyz#重写规则RewriteRuleoldstuff/.html$newstuff.html上述例子中,对/xyz/oldstuff.html的请求被正确地重写为对物理文件/abc/def/newstuff.html的请求。

仅供ApacheHacker们参考以下列出了内部处理的详细步骤:

请求:

/xyz/oldstuff.html内部处理过程:

/xyz/oldstuff.html-/abc/def/oldstuff.html(per-serverAlias)/abc/def/oldstuff.html-/abc/def/newstuff.html(per-dirRewriteRule)/abc/def/newstuff.html-/xyz/newstuff.html(per-dirRewriteBase)/xyz/newstuff.html-/abc/def/newstuff.html(per-serverAlias)结果:

/abc/def/newstuff.html虽然这个过程看来很繁复,但是由于目录级重写的到来时机已经太晚了,它不得不把这个(重写)请求重新注入到Apache核心中,所以Apache内部确实是这样处理的。

但是:

它的开销并不象看起来的那样大,因为重新注入完全在Apache服务器内部进行,而且这样的过程在Apache内部也为其他许多操作所使用。

所以,你可以充分信任其设计和实现是正确的。

RewriteCond指令说明定义重写发生的条件语法RewriteCondTestStringCondPatternflags作用域serverconfig,virtualhost,directory,.htaccess覆盖项FileInfo状态扩展(E)模块mod_rewriteRewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。

条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件(TestString能够与CondPattern匹配)时才会起作用。

TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:

RewriteRule反向引用,引用方法是:

$N(0=N=9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern匹配的分组成分(圆括号!

)。

RewriteCond反向引用,引用方法是:

%N(1=N=9)引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!

)。

RewriteMap扩展,引用方法是:

$mapname:

key|default细节请参见RewriteMap指令。

服务器变量,引用方法是:

%NAME_OF_VARIABLENAME_OF_VARIABLE可以是下表列出的字符串之一:

HTTP头连接与请求HTTP_USER_AGENTHTTP_REFERERHTTP_COOKIEHTTP_FORWARDEDHTTP_HOSTHTTP_PROXY_CONNECTIONHTTP_ACCEPTREMOTE_ADDRREMOTE_HOSTREMOTE_PORTREMOTE_USERREMOTE_IDENTREQUEST_METHODSCRIPT_FILENAMEPATH_INFOQUERY_STRINGAUTH_TYPE服务器自身日期和时间其它DOCUMENT_ROOTSERVER_ADMINSERVER_NAMESERVER_ADDRSERVER_PORTSERVER_PROTOCOLSERVER_SOFTWARETIME_YEARTIME_MONTIME_DAYTIME_HOURTIME_MINTIME_SECTIME_WDAYTIMEAPI_VERSIONTHE_REQUESTREQUEST_URIREQUEST_FILENAMEIS_SUBREQHTTPS这些变量都对应于类似命名的HTTPMIME头、Apache服务器的C变量、Unix系统中的structtm字段,其中的大多数在其他的手册或者CGI规范中都有说明。

其中为mod_rewrite所特有的变量如下:

IS_SUBREQ如果正在处理的请求是一个子请求,它将包含字符串true,否则就是false。

模块为了解析URI中的附加文件,可能会产生子请求。

API_VERSION这是正在使用中的Apache模块API(服务器和模块之间内部接口)的版本,其定义位于include/ap_mmn.h中。

此模块API版本对应于正在使用的Apache的版本(比如在Apache1.3.14的发行版中这个值是19990320:

10)。

通常,对它感兴趣的是模块的开发者。

THE_REQUEST这是由浏览器发送的完整的HTTP请求行(比如:

GET/index.htmlHTTP/1.1)。

它不包含任何浏览器发送的其它头信息。

REQUEST_URI这是在HTTP请求行中所请求的资源(比如上述例子中的/index.html)。

REQUEST_FILENAME这是与请求相匹配的完整的本地文件系统的文件路径名。

HTTPS如果连接使用了SSL/TLS,它将包含字符串on,否则就是off(无论mod_ssl是否已经加载,该变量都可以安全的使用)。

其它注意事项:

1.SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的即Apache服务器内部的request_rec结构中的filename字段。

第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。

2.特殊形式:

%ENV:

variable,其中的variable可以是任意环境变量。

它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。

3.特殊形式:

%SSL:

variable,其中的variable可以是一个SSL环境变量的名字,无论mod_ssl模块是否已经加载都可以使用(未加载时为空字符串)。

比如:

%SSL:

SSL_CIPHER_USEKEYSIZE将会被替换为128。

4.特殊形式:

%HTTP:

header,其中的header可以是任意HTTPMIME头的名称。

它总是可以通过查找HTTP请求而得到。

比如:

%HTTP:

Proxy-Connection将被替换为Proxy-Connection:

HTTP头的值。

5.预设形式:

%LA-U:

variable,variable的最终值在执行一个内部(基于URL的)子请求后确定。

当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。

例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写,就必须使用%LA-U:

REMOTE_USER。

因为此变量是由URL重写(mod_rewrite)步骤之后的认证步骤设置的。

但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的,而认证步骤先于API修正步骤,所以可以用%REMOTE_USER。

6.预设形式:

%LA-F:

variable,variable的最终值在执行一个内部(基于文件名的)子请求后确定。

大多数情况下和上述的LA-U是相同的。

CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。

TestString将被首先计算,然后再与CondPattern匹配。

注意:

CondPattern是一个perl兼容的正则表达式,但是还有若干增补:

1.可以在CondPattern串的开头使用!

(惊叹号)来指定不匹配。

2.CondPatterns有若干特殊的变种。

除了正则表达式的标准用法,还有下列用法:

CondPattern(词典顺序的大于)将CondPattern视为纯字符串,与TestString按词典顺序进行比较。

如果TestString大于CondPattern则为真。

=CondPattern(词典顺序的等于)将CondPattern视为纯字符串,与TestString按词典顺序进行比较。

如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。

如果CondPattern是(两个双引号),则TestString将与空字符串进行比较。

-d(目录)将TestString视为一个路径名并测试它是否为一个存在的目录。

-f(常规文件)将TestString视为一个路径名并测试它是否为一个存在的常规文件。

-s(非空的常规文件)将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。

-l(符号连接)将TestString视为一个路径名并测试它是否为一个存在的符号连接。

-x(可执行)将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。

该权限由操作系统检测。

-F(对子请求存在的文件)检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。

它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

-U(对子请求存在的URL)检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。

它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!

注意所有这些测试都可以用惊叹号作前缀(!

)以实现测试条件的反转。

3.还可以在CondPattern之后追加特殊的标记flags作为RewriteCond指令的第三个参数。

flags是一个以逗号分隔的以下标记的列表:

nocase|NC(忽略大小写)它使测试忽略大小写,扩展后的TestString和CondPattern中A-Z和a-z是没有区别的。

此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。

ornext|OR(或下一条件)它以OR方式组合若干规则的条件,而不是隐含的AND。

典型的例子如下:

RewriteCond%REMOTE_HOSThost1.*ORRewriteCond%REMOTE_HOSThost2.*ORRewriteCond%REMOTE_HOSThost3.*RewriteRule.针对这3个主机的规则集.如果不用这个标记,你就必须要书写三次条件/规则对。

举例如果要按请求头中的User-Agent:

重写一个站点的主页,可以这样写:

RewriteCond%HTTP_USER_AGENTMozilla.*RewriteRule/$/homepage.max.htmlLRewriteCond%HTTP_USER_AGENTLynx.*RewriteRule/$/homepage.min.htmlLRewriteRule/$/homepage.std.htmlL解释:

如果你使用的浏览器识别标志是Mozilla,则你将得到内容最大化的主页(含有Frames等等)。

如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页(不含table等等)。

如果上述条件都不满足(使用的是其他浏览器),则你得到的是一个标准的主页。

RewriteEngine指令说明打开或关闭运行时的重写引擎语法RewriteEngineon|off默认值RewriteEngineoff作用域serverconfig,virtualhost,directory,.htaccess覆盖项FileInfo状态扩展(E)模块mod_rewriteRewriteEngine指令打开或关闭运行时的重写引擎。

如果设置为off,则此模块在运行时不执行任何重写操作,同时也不更新SCRIPT_URx环境变量。

使用该指令可以使此模块无效,而无须注释所有的RewriteRule指令!

注意:

默认情况下,重写配置是不可继承的,也就是必须在每个需要使用重写引擎的虚拟主机中设置一个RewriteEngineon指令。

RewriteLock指令说明设置RewriteMap同步所使用的锁文件名语法RewriteLockfile-path作用域serverconfig状态扩展(E)模块mod_rewrite此指令设置mod_rewrite为了和RewriteMap程序通讯而使用的同步锁文件的名称。

在需要使用重写映射表程序(rewritingmap-program)时,它必须是一个本地路径(而不能是一个NFS挂接设备)。

对其他类型的重写映射表(rewritingmap),则无此要求。

RewriteLog指令说明设置重写引擎日志的文件名语法RewriteLogfile-path作用域serverconfig,virtualhost状态扩展(E)模块mod_rewriteRewriteLog指令设置用于记录所有重写操作的日志文件的名称。

如果此文件名不以斜杠(/)开头,则它是相对于ServerRoot的,此指令应该在每个服务器级别的配置中仅仅出现一次。

如果要关闭对重写操作的记录,不推荐将Filename设为/dev/null,因为,虽然重写引擎不能输出记录了,但仍会在内部建立这个日志文件,这样会使服务器速度降低,而且对管理员毫无益处!

要关闭日志,可以删除或注解RewriteLog指令,或者使用RewriteLogLevel0的设置安全参见安全方面的提示文档,其中讲述了为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。

示例RewriteLog/usr/local/var/apache/logs/rewrite.logRewriteLogLevel指令说明设置重写日志的详细程度语法RewriteLogLevelLevel默认值RewriteLogLevel0作用域serverconfig,virtualhost状态扩展(E)模块mod_rewriteRewriteLogLevel指令设置重写引擎日志的详细程度的级别。

0(默认级别)意味着不记录,而9或更大的值意味着记录所有操作。

要关闭重写引擎日志,可以简单地将Level设为0,以关闭所有重写操作的记录。

较高的Level值会使Apache服务器速度急剧下降!

大于2的Level值只用于调试目的!

示例RewriteLogLevel3RewriteMap指令说明定义用于关键词查找的映射函数语法RewriteMapMapNameMapType:

MapSource作用域serverconfig,virtualhost状态扩展(E)模块mod_rewrite兼容性Apache2.0.41及以后的版本中可以使用不同的dbm类型RewriteMap指令定义了一个映射表(RewritingMap),映射函数将使用该表来查找关键字然后插入/替换字段。

此查找操作的源可以是多种类型。

MapName是映射表的名称,指定了一个映射函数,用于重写规则的字符串替换,它可以是下列形式之一:

$MapName:

LookupKey$MapName:

LookupKey|DefaultValue如果使用了这样的形式,则会在MapName中查找关键词LookupKey。

如果找到了,则被替换成SubstValue;如果没有找到,则被替换成DefaultValue,如果没有指定DefaultValue,则被替换成空字符串。

例如,你可能定义这样一个RewriteMap:

RewriteMapexamplemaptxt:

/path/to/file/map.txt然后你就可以像下面这样在RewriteRule中使用该映射:

RewriteRule/ex/(.*)$examplemap:

$1可以使用下列MapType和MapSource的组合:

标准纯文本MapType:

txt,MapSource:

有效的Unix文件系统文件名这是重写映射表的标准形式。

MapSource是一个纯文本文件,包含空行、注释行(以字符#打头),以及每行一个的替换对,如下所示:

MatchingKeySubstValue例子#map.txt-rewritingmapRalf.S.Engelschallrse#BastardOperatorFromHellMr.Joe.Averagejoe#Mr.AverageRewriteMapreal-to-usertxt:

/path/to/file/map.txt随机纯文本MapType:

rnd,MapSource:

有效的Unix文件系统文件名这个与上述的标准纯文本很相似,但它有一个特殊的后处理特性:

查找完毕后,会解析其中包含的|符号(含义为或)。

也就是说,会随机地选择其中之一作为返回值。

虽然这看似毫无意义,但设计它的意图是在一个查找值是服务器名称的反向代理环境中实现负载平衡。

例子映射文件#map.txt-rewritingmapstaticwww1|www2|www3|www4dynamicwww5|www6配置指令RewriteMapserversrnd:

/path/to/file/map.txtRewriteRule/(.*/.(png|gif|jpg)http:

/$servers:

static/$1NC,P,LRewriteRule/(.*)http:

/$servers:

dynamic/$1P,L散列文件MapType:

dbm=type,MapSource:

有效的Unix文件系统文件名这里的源是一个二进制格式的DBM文件,包含了与纯文本相同的内容,但是因为它有优化了的特殊表现形式,使它的查找速度明显快得多。

此type可以是sdbm,gdbm,ndbm,db(由编译时配置决定)。

如果省略type,则使用编译时选择的缺省值。

你可以使用任何DBM工具或者下列Perl脚本来创建这个文件,但必须保证DBM的类型正确。

建立NDBM文件的例子如下:

#!

/path/to/bin/perl#txt2dbm-将txt映射表转换为dbm格式#useNDBM_File;useFcntl;($txtmap,$dbmmap)=ARGV;open(TXT,$txtmap)ordieCouldntopen$txtmap!

/n;tie(%DB,NDBM_File,$dbmmap,O_RDWR|O_TRUNC|O_CREAT,0644)ordieCouldntcreate$dbmmap!

/n;while

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 城乡园林规划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1