澳门新萄京官方网站-www.8455.com-澳门新萄京赌场网址

Rewrite法则简单介绍,APACHE服务器500漏洞非常多搞

2019-11-16 作者:www.8455.com   |   浏览(183)

1、简介

  Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块。它的功能非常强大,可以操作URL中的所有部分。

  因此我们就可以改写url,给用户提供一个简介大方的url,当用户访问时可以通过mod_rewrite模块功能转换为真正的资源路径。通过mod_rewrite能实现的功能还有很多,例如隐藏真实地址、实现URL跳转、域名跳转、防盗链、限制访问资源类型等等。

伪静态的产生主要是为了增强搜索引擎的友好度,方便用户记忆。一般通过正则匹配来重写动态网站的URL使其静态化。那么在Windows平台下如何设置Apache支持URL重写功能,以及如何配置.htaccess文件来实现伪静态呢?

apache 模块mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。 它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。 此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
 
 
此模块可以操作URL的所有部分(包括路径信息部分),在服务器级的(httpd.conf)和目录级的(. htaccess )配置都有效,还可以生成最终请求字符串。 此重写操作的结果可以是内部子处理,也可以是外部请求的转向,甚至还可以是内部代理处理。
这里着重介绍一下RewriteCond 的规则以及参数说明。RewriteCond指令定义了规则生效的条件,即在一个RewriteRule指令之前可以有一个或多个RewriteCond指令。 条件之后的重写规则仅在当前URI与Pattern匹配并且满足此处的条件(TestString能够与CondPattern匹配)时才会起作用。
【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]
【作用域】server config, virtual host, directory, .htaccess
【覆盖项】FileInfo
【状态】 扩展(E)
【模块】mod_rewrite
TestString是一个纯文本的字符串,但是还可以包含下列可扩展的成分:
RewriteRule反向引用 ,引用方法是:$N (0 <= N <= 9)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern匹配的分组成分(圆括号!)。
RewriteCond反向引用 ,引用方法是:%N (1 <= N <= 9)引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
RewriteMap扩展 ,引用方法是:${mapname:key|default} 细节请参见RewriteMap指令 。
服务器变量 ,引用方法是:%{NAME_OF_VARIABLE} NAME_OF_VARIABLE可以是下表列出的字符串之一:
HTTP头连接与请求   
HTTP_USER_AGENT
HTTP_REFERER
HTTP_COOKIE
HTTP_FORWARDED
HTTP_HOST
HTTP_PROXY_CONNECTION
HTTP_ACCEPT     REMOTE_ADDR
REMOTE_HOST
REMOTE_PORT
REMOTE_USER
REMOTE_IDENT
REQUEST_METHOD
SCRIPT_FILENAME
PATH_INFO
QUERY_STRING
AUTH_TYPE 
服务器自身    日期和时间    其它
DOCUMENT_ROOT
SERVER_ADMIN
SERVER_NAME
SERVER_ADDR
SERVER_PORT
SERVER_PROTOCOL
SERVER_SOFTWARE   TIME_YEAR
TIME_MON
TIME_DAY
TIME_HOUR
TIME_MIN
TIME_SEC
TIME_WDAY
TIME      API_VERSION
THE_REQUEST
REQUEST_URI
REQUEST_FILENAME
IS_SUBREQ
HTTPS
 
这些变量都对应于类似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,其中的大多数在其他的手册或者CGI规范中都有说明。 其中为mod_rewrite所特有的变量如下:
IS_SUBREQ
如果正在处理的请求是一个子请求,它将包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,可能会产生子请求。
API_VERSION
这是正在使用中的Apache模块API(服务器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。 此模块API版本对应于正在使用的Apache的版本(比如在Apache 1.3.14的发行版中这个值是19990320:10)。 通常,对它感兴趣的是模块的开发者。
THE_REQUEST
这是由浏览器发送的完整的HTTP请求行(比如:”GET /index.html HTTP/1.1″)。 它不包含任何浏览器发送的其它头信息。
REQUEST_URI
这是在HTTP请求行中所请求的资源(比如上述例子中的”/index.html”)。
REQUEST_FILENAME
这是与请求相匹配的完整的本地文件系统的文件路径名。
HTTPS
如果连接使用了SSL/TLS,它将包含字符串”on”,否则就是”off”(无论mod_ssl 是否已经加载,该变量都可以安全的使用)。
 
其它注意事项:
SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的filename字段。 第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。
特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。 它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。
特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl 模块是否已经加载都可以使用(未加载时为空字符串)。 比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。 它总是可以通过查找HTTP请求而得到。 比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后确定。 当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。 例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写, 就必须使用%{LA-U:REMOTE_Rewrite法则简单介绍,APACHE服务器500漏洞非常多搞定办法与强制跳转。USER}。 因为此变量是由URL重写(mod??_rewrite)步骤之后的认证步骤设置的。 但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的, 而认证步骤先于API修正步骤,所以可以用%{REMOTE_USER}。
预设形式:%{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 ‘(词典顺序的等于)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString等于CondPattern(两个字符串逐个字符地完全相等)则为真。 如果CondPattern是”"(两个双引号),则TestString将与空字符串进行比较。
‘-d ‘(目录)
将TestString视为一个路径名并测试它是否为一个存在的目录。
‘-f ‘(常规文件)
将TestString视为一个路径名并测试它是否为一个存在的常规文件。
‘-s ‘(非空的常规文件)
将TestString视为一个路径名并测试它是否为一个存在的、尺寸大于0的常规文件。
‘-l ‘(符号连接)
将TestString视为一个路径名并测试它是否为一个存在的符号连接。
‘-x ‘(可执行)
将TestString视为一个路径名并测试它是否为一个存在的、具有可执行权限的文件。 该权限由操作系统检测。
‘-F ‘(对子请求存在的文件)
检查TestString是否为一个有效的文件,而且可以在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
Rewrite法则简单介绍,APACHE服务器500漏洞非常多搞定办法与强制跳转。‘-U ‘(对子请求存在的URL)
检查TestString是否为一个有效的URL,而且可以在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
注意: 所有这些测试都可以用惊叹号作前缀(‘!’)以实现测试条件的反转。
3、还可以在CondPattern之后追加特殊的标记[flags] 作为RewriteCond指令的第三个参数。flags是一个以逗号分隔的以下标记的列表:
‘nocase|NC ‘(忽略大小写)
它使测试忽略大小写,扩展后的TestString和CondPattern中’AZ’ 和’a-z’是没有区别的。 此标记仅用于TestString和CondPattern的比较,而对文件系统和子请求的检查不起作用。
‘ornext|OR ‘(或下一条件)
它以OR方式组合若干规则的条件,而不是隐含的AND。 典型的例子如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule …针对这3个主机的规则集…如果不用这个标记,你就必须要书写三次条件/规则对。
举例
如果要按请求头中的”User-Agent:”重写一个站点的主页,可以这样写:
RewriteCond % { HTTP_USER_AGENT }  ^Mozilla.* RewriteRule ^/$ /homepage. max .html  [ L ]
 
RewriteCond % { HTTP_USER_AGENT }  ^Lynx.* RewriteRule ^/$ /homepage. min .html  [ L ]
 
RewriteRule ^/$ /homepage .std.html  [ L ]
解释:
如果你使用的浏览器识别标志是’Mozilla’,则你将得到内容最大化的主页(含有Frames等等)。
如果你使用的是(基于终端的)Lynx, 则你得到的是内容最小化的主页(不含table等等)。
如果上述条件都不满足(使用的是其他浏览器),则你得到的是一个标准的主页。

Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。这tm都是废话,反正我用了,那就肯定是我的服务器已经支持了,我们买服务器的时候也肯定会主要到能不能支持htaccess文件了。

2、工作流程

  mod_rewrite模块在运行时会使用两个Hook程序。

  第一个是从URL到文件名转换的Hook。当有访问到达Apache服务器的时,服务器会确认相应主机(或虚拟主机),这时mod_rewrite模块就开始工作,它将会先处理服务器全局中mod_rewrite模块所提供的指令,然后根据用户提供的指令进行改写。

  第二个是修正URL的Hook。在此阶段mod_rewrite模块会处理非全局的设置。例如,目录中的.htaccess文件中的设置。但是此时已经完成URL的翻译(由URL转换为文件名),因此是无法在次对目录级别的URL进行改写操作,但是moe_rewrite模块会将已翻译的URL再次转换为URL的状态,继续进行目录级别的URL改写。(mod_rewrite模块将会使用读后请求阶段的回叫函数重新开始一个请求的循环处理)

Rewirte模块规则集的处理

  当mod_rewrite在这两个API阶段中开始执行时,它会读取配置结构中配置好的 (或者是在服务启动时建立的服务器级的,或者是在遍历目录采集到的目录级的)规则集,然后,启动URL重写引擎来处理(带有一个或多个条件的)规则集。无论是服务器级的还是目录级的规则集,都是由同一个URL重写引擎处理,只是最终结果处理不同而已。

  规则集中规则的顺序是很重要的,因为重写引擎是按一种特殊的顺序处理的:逐个遍历每个规则(RewriteRule指令),如果出现一个匹配条件的规则,则可能回头遍历已有的规则条件(RewriteCond指令)。由于历史的原因,条件规则是前置的,所以控制流程略显冗长,细节见图-1。

澳门新萄京官方网站 1

  可见,URL首先与每个规则的Pattern匹配,如果匹配失败,mod_rewrite将立即终止此规则的处理,继而处理下一个规则。如果匹配成功,mod_rewrite将寻找相应的规则条件,如果一个条件都没有,则简单地用Substitution构造的新值来替换URL,然后继续处理其他规则;但是如果条件存在,则开始一个内部循环按其列出的顺序逐个处理。对规则条件的处理有所不同:URL并不与模式进行匹配,而是首先通过扩展变量、反向引用、查找映射表等步骤建立一个TestString字符串,然后用它来与CondPattern匹配。如果匹配失败,则整个条件集和对应的规则失败;如果匹配成功,则执行下一个规则直到所有条件执行完毕。如果所有条件得以匹配,则以Substitution替换URL,并且继续处理。(本部分引用译者:金步国)

网络图片:

澳门新萄京官方网站 2

 

一、让Apache支持URL重写

摘自 第零空间

澳门新萄京官方网站,基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局 下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。这里针对的就是vps服务器的了,如果你是虚拟主机,就你想动(httpd.conf)文件你也没有权限。哈

3、URL重写指令

  最简单的重写指令可以简单到让你无法想象!

  只需要两步就可以完成了。第一使用RewriteEngine开启mod_rewrite模块功能;第二通过RewriteRule定义URL重写规则

       在httpd.conf中加载mod_rewrite.so组件开启Apache中的URL重写功能。

模块mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。 它支持每个完整规则可以拥有不限数量的子规则以及附...

基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。这就重要了,一般我们买的虚拟主机,就是开启这个功能的,所以你在空间中任意目录下放入这个文件,都可以起作用的了。

  1)、URL重写指令套路

1 ---------------------------------------------------------------
2 RewriteEngine on   #开启mod_rewrite模块功能
3 RewriteBase 路径     #基准URL(使用alias设置别名则需使用这个)
4 RewriteCond TestString CondPattern [flags]      #重写条件(可以多个)
5 RewriteRule Pattern Substitution [flags]          #重写规则
6 ----------------------------------------------------------------
7 #4、5行可以可以多个
8 #按顺序一个一个执行RewriteRule([flags不终止情况下])
9 ##以上是常用的指令,还有一些很少见的指令,需要的自己去查资料了解

二、配置.htaccess文件,定义重写规则

放两个在htaccess中使用的例子:

  2)、RewriteRule Pattern Substitution [flags]

  1、pattern是作用于当前URL的perl兼容的正则表达式。当前URL是指该规则生效时刻的URL的值。它可能与被请求时的URL截然不同,因为之前可能被其他RewriteRule或者alias指令修改过。

  2、Substitution是当URL与Pattern匹配成功后。用来代替的字符串。

  • 可以对pattern反向引用$N(N=0~9),表示正则表达式中第N个括号中的内容
  • 对最后匹配的RewriteCond反向引用%N(N=0~9),表示最后匹配的RewriteCond第N对括号中的内容
  • 服务器变量%{VARNAME}
  • 映射函数调用${mapname:key|default} (通过RewriteMap指令定义映射辅助完成)

  3、[flags],标志符,多个则用逗号隔开。

标志符(摘抄于网上):

redirect|R [=code] (强制重定向 redirect)

  以 ) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 .

forbidden|F (强制URL为被禁止的 forbidden)

  强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

gone|G(强制URL为已废弃的 gone)

  强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

  此标记使替换成分被内部地强制为代理请求,并立即(即, 重写规则处理立即中断)把处理移交给代理模块。你必须确保此替换串是一个有效的(比如常见的以 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译“httpd”程序。

last|L (最后一个规则 last)

  立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如, ‘/e/www/’.

next|N (重新执行 next round)

  重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。
但是要小心,不要制造死循环!

chain|C (与下一个规则相链接 chained)

  此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。

type|T=MIME-type(强制MIME类型 type)

  强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令,以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request)

  在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

  根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

nocase|NC (忽略大小写 no case)

  它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string append)

  此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

noescape|NE (在输出中不对URI作转义 no URI escaping)

  此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

  RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass through)

  此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子:如果要通过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]

Alias /def /ghi
  如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器,它可以重写uri=/abc/…为filename=/def/…,但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

  如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

skip|S=num (跳过后继的规则 skip)

  此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

env|E=VAR:VAL (设置环境变量 environment variable)

  此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。使用它可以从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)

  它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数,可选的path是cookie的路径。

1、 在配置重写规则之前,需要在httpd.conf中设置AllowOverride All(至少设置为AllowOverride FileInfo)让Apache能够正常的读取.htaccess 文件的内容。

URL重定向:

#这个是URL重定向用的,用于将不带www的域名重定向到www的域名上。 RewriteCond %{HTTP_HOST} ^(domain.com)(:80)? [NC] RewriteRule ^(.*) http://www.domain.com/$1 [R=301,L] order deny,allow

重定向子目录到子域名:

# 重定向domain.com/forums 到 bbs.domain.com RewriteCond %{REQUEST_URI} ^/forums/ RewriteRule /domain/(.*) http://bbs.domain.com/$1 [R=permanent,L]

以上是一些简单的规则,带啊不明白可以往下拉,然后看看详细的解释。

先看看这些是什么意思

%{HTTP_HOST}                得到主域名(比如
%{REQUEST_URI}               得到除主域名之外的URL部分(比如/index.php?p=12)
%{REQUEST_FILENAME}          得到请求的文件名

这里有一个实例,请看图片

如果访问localhost/pc/tind.php,打印出如下图的结果。那我们得到上述结果

澳门新萄京官方网站 3

我又使用 localhost/pc/t 测试访问目录t下的index.php文件,打印如下图。请注意,这里使用的url是不带结尾斜杠的,当时,当访问时就会自动追加上结尾的“/”了。所以得到的REQUEST_URI也一定是以“/”结尾的。

澳门新萄京官方网站 4

好了,现在大家知道了%{HTTP_HOST} 和%{REQUEST_URI}是什么意思了。

  3)、RewriteCond TestString CondPattern [flags]

  Rewritecond指令定义一条规则条件。在一条rewriterule指令前面可能会有一条或者多条rewritecond指令,只有当自身模板匹配成功且这些条件也满足时(即RewriteRule中的pattern匹配成功),规则条件才被应用于当前URL处理。

  1、TestString是一个纯文本的字符串

  • 可以对pattern反向引用$N(N=0~9),紧跟在RewriteCond后面的RewriteRule正则表达式中第N个括号中的内容
  • 反向引用%N(N=0~9),表示RewriteCond中CondPattern中第N对括号中的内容
  • 服务器变量%{VARNAME}

  2、CondPattern是条件pattern,一个应用于当前实例TestString的正则表达式。即TestString与条件pattern条件进行匹配。如果匹配则RewriteCond的值为Rrue,反之为False

可以使用以下特殊变量(可使用'!'实现反转):

'>CondPattern’ (大于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真。

‘=CondPattern’ (等于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是 “” (两个引号紧挨在一起) 此时需TestString 为空字符串方为真。

‘-d’ (是否为目录) 将testString当作一个目录名,检查它是否存在以及是否是一个目录。

‘-f’ (是否是regular file) 将testString当作一个文件名,检查它是否存在以及是否是一个regular文件。

‘-s’ (是否为长度不为0的regular文件) 将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件。

‘-l’ (是否为symbolic link) 将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link。

‘-F’ (通过subrequest来检查某文件是否可访问) 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

‘-U’ (通过subrequest来检查某个URL是否存在) 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。

   3、[flags]是第三个参数,多个标志之间用逗号隔开

’nocase|NC’ (不区分大小写)   在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响.

’ornext|OR’ (建立与下一个条件的或的关系)   默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。

 

  伪静态的产生主要是为了增强搜索引擎的友好度,方便用户记忆。一般通过正则匹配来重写动态网站的URL使其静态化。那么在Windows平台下如何设置Apache支持URL重写功能,以及如何配置.htaccess文件来实现伪静态呢?

接下来我们了解一下两个转换方法RewriteCond和RewriteRule

RewriteCond指令定义了规则生效的条件,且在一个RewriteRule指令之 前可以有一个或多个RewriteCond指令。 条件之后的重写规则RewriteRule仅在当前URI与Pattern匹配并且满足此处的条件(TestString能够与CondPattern匹 配)时才会起作用。

就是说RewriteCond和RewriteRule是成组使用的,其中RewriteCond可以为多个。RewriteCond来指定匹配的条件,RewriteRule来指定满足条件的式将进行那种转换。前者称为条件,后者称为规则。

一至多个条件加一条规则组合成一个URL重写规则。如:

RewriteCond %{HTTP_HOST} ^www.zzz.com RewriteCond %{REQUEST_URI} !^user.php$ RewriteCond %{REQUEST_URI} .php$ RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]

以上面代码进行讲解,两个命令的使用格式如下。

【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]

【说明】定义重写的规则
【语法】RewriteRule CondPattern rewritePattern [flags]

TestString是要匹配的对象变量,CondPattern是匹配条 件,rewritePattern 是重写规则,flags是扩展规则标记。

以第一句【RewriteCond %{HTTP_HOST} ^www.zzz.com】

分析:%{HTTP_HOST}作为 TestString对象,代表的是请求主域名地址。【^www.zzz.com】,作为CondPattern 是针对TestString对象进行的条件匹配,这里是表示以www.zzz.com开头的意思。

以【RewriteRule (.*).php$ [R]】来分析:

【(.*).php$】作为CondPattern,是针对以上三个条件匹配之后的URL进行条件筛选,表示任何一.php结尾的 URL。【

好了,来看看这些标记都是什么意思

redirect|R [=code] (强制重定向 redirect)

以 ) 为前缀的Substitution可以强制性执行一个外部重定向。 如果code没有指定,则产生一个HTTP响应代码302(临时性移动)。 如果需要使用在300-400范围内的其他响应代码,只需在此指定这个数值即可, 另外,还可以使用下列符号名称之一: temp (默认的), permanent, seeother. 用它可以把规范化的URL反馈给客户端,如, 重写“/~”为 “/u/”,或对/u/user加上斜杠,等等。

注意: 在使用这个标记时,必须确保该替换字段是一个有效的URL! 否则,它会指向一个无效的位置! 并且要记住,此标记本身只是对URL加上 通常,你会希望停止重写操作而立即重定向,则还需要使用’L’标记.

forbidden|F (强制URL为被禁止的 forbidden)

强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。 使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。

gone|G’(强制URL为已废弃的 gone)

强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。 使用这个标记,可以标明页面已经被废弃而不存在了.

proxy|P (强制为代理 proxy)

此标记使替换成分被内部地强制为代理请求,并立 即(即, 重写规则处理立即中断)把处理移交给代理模块。 你必须确保此替换串是一个有效的(比如常见的以 使用这个标记,可以把某些远程成分映射到本地服务器名称空间, 从而增强了ProxyPass指令的功能。

注意: 要使用这个功能,代理模块必须编译在Apache服务器中。 如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。 如果有,则mod_rewrite可以使用这个功能; 如果没有,则必须启用mod_proxy并重新编译“httpd”程序。

last|L (最后一个规则 last)

立即停止重写操作,并不再应用其他重写规则。 它对应于Perl中的last命令或C语言中的break命令。 这个标记可以阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如, ‘/e/www/’.

next|N (重新执行 next round)

重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。 它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。
但是要小心,不要制造死循环!

chain|C (与下一个规则相链接 chained)

此标记使当前规则与下一个(其本身又可以与其后 继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配, 则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。

type|T=MIME-type(强制MIME类型 type)

强制目标文件的MIME类型为MIME-type。 比如,它可以用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。

nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request)

在当前请求是一个内部子请求时,此标记强制重写 引擎跳过该重写规则。 比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用, 它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。

根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理, 而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。

nocase|NC (忽略大小写 no case)

它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。

qsappend|QSA (追加请求串 query string append)

此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。

noescape|NE (在输出中不对URI作转义 no URI escaping)

此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如:

RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

passthrough|PT (移交给下一个处理器 pass through)

此标记强制重写引擎将内部结构 request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子: 如果要通过mod_rewrite的重写引擎重写/abc为/def, 然后通过mod_alias使/def转变为/ghi,可以这样:

RewriteRule ^/abc(.*) /def$1 [PT]Alias /def /ghi

如果省略了PT标记,虽然mod_rewrite运作正常, 即, 作为一个使用API的URI到文件名翻译器, 它可以重写uri=/abc/…为filename=/def/…, 但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

注意: 如果需要混合使用不同的包含URI到文件名翻译器的模块时, 就必须使用这个标记。。 混合使用mod_alias和mod_rewrite就是个典型的例子。

For Apache hackers

如果当前Apache API除了URI到文件名hook之外,还有一个文件名到文件名的hook, 就不需要这个标记了! 但是,如果没有这样一个hook,则此标记是唯一的解决方案。 Apache Group讨论过这个问题,并在Apache 2.0 版本中会增加这样一个hook。

skip|S=num (跳过后继的规则 skip)

此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

env|E=VAR:VAL (设置环境变量 environment variable)

此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。 此标记可以多次使用以设置多个变量。 这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。 使用它可以从URL中剥离并记住一些信息。

cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)

它在客户端浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。 domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数, 可选的path是cookie的路径。

  4)、Rewrite时服务器变量(仅列出少数)

HTTP headers:HTTP_USER_AGENT,  HTTP_REFERER,  HTTP_COOKIE,  HTTP_HOST,  HTTP_ACCEPT

connection & request:REMOTE_ADDR,  QUERY_STRING

server internals::DOCUMENT_ROOT,  SERVER_PORT,  SERVER_PROTOCOL

system stuff: TIME_YEAR,  TIME_MON,  TIME_DAY

 

一、让Apache支持URL重写

RewriteRule指令格式

【说明】定义重写的规则
【语法】RewriteRule Pattern rewritePattern [flags]

RewriteRule指令,可以定义一条重写 规则,规则间的顺序非常重要。对Apache1.2及以后的版本,模板(Pattern)是一个POSIX正则式,用以匹配当前的URL。当前的URL不 一定是最初提交的URL,因为可能用一些规则在此规则前已经对URL进行了处理。rewritePattern 大多数文章写为Substitution ,这里为了更清楚的认识故写为rewritePattern 。

“.” ——————- 换行符以外的所有字符
“w” —————- 匹配字母或数字或下划线或汉字
“s” —————– 匹配任意的空白符
“d” —————– 匹配数字
“b” —————– 匹配单词的开始或结束
“^” —————— 匹配字符串的开始
“$” —————— 匹配字符串的结束
“*” —————— 重复零次或更多次
“ ” —————— 重复一次或更多次
“?” ——————- 重复零次或一次
“{n}” —————- 重复n次
“{n,}” ————— 重复n次或更多次
“{n,m}” ————- 重复n到m次
“[0-9]” ————– 匹配单个数字

来给出一个具体的例子吧

RewriteRule index.html index.php 比如:http://www.andelse.cn/index.html -> http://www.andelse.cn/index.php RewriteRule ^test([0-9]*).html$ test.php?id=$1 比如:http://www.andelse.cn/test8.html -> http://www.andelse.cn/test.php?id=8 RewriteRule ^cat-([0-9] )-([0-9] ).html$ cat.php?id1=$1&id2=$2 比如:http://www.andelse.cn/cat-1-3.html -> http://www.andelse.cn/cat.php?id1=1&id2=3 RewriteRule ^cat-([a-zA-Z0-9-]*)-([0-9] )-([0-9] ).html$ cat.php?id0=$1&id1=$2&id2=$3 比如:http://www.andelse.cn/cat-zbc2ac-3-5.html -> http://www.andelse.cn/cat.php?id0=zbc2ac&id1=3&id2=5 RewriteRule ^cat1-([0-9] )-([0-9] )-([0-9] ).html$ cat1.php?id1=$1&id2=$2&id3=$3 比如:http://www.andelse.cn/cat1-4-3-8.html -> http://www.andelse.cn/cat1.php?id1=4&id2=3&id3=8 RewriteRule ^cat([0-9]*)/$ cat.php?id1=$1 比如:http://www.andelse.cn/cat5/ -> http://www.andelse.cn/cat.php?id1=5 RewriteRule ^catm([0-9]*)/([0-9]*)/$ catm.php?id1=$1&id2=$2 比如:http://www.andelse.cn/catm6/3/ -> http://www.andelse.cn/catm.php?id1=6&id2=3

最后再看看看rewriteCond指令吧,似乎顺序有问题,不影响阅读了....

  5)、简单正则表达式规则

. 匹配任何单字符

[chars] 匹配字符串:chars

[^chars] 不匹配字符串:chars

text1|text2 可选择的字符串:text1或text2

? 匹配0到1个字符

* 匹配0到多个字符

匹配1到多个字符

^ 字符串开始标志

$ 字符串结束标志

n 转义符标志

 【注意】:一代Apache要求URL有斜杠而二代Apache却不允许,因此使用 ^/?

 

       在httpd.conf中加载mod_rewrite.so组件开启Apache中的URL重写功能。

RewriteCond指令格式

【说明】定义重写发生的条件
【语法】RewriteCond TestString CondPattern [flags]

RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当RewriteCond的条件(CondPattern)匹配成功时,RewriteRule的重写规则才被应用于当前URL处理。

4、例子解析

例1(简单例子):

(在.htaccess里进行规制重写)

RewriteEngine ON 
RewriteRule  ^user/(w )/?$user.php?id=$1

^:输入的开头  以user/开头请求的地址

(w ):提取所有的字母,传给$1

/?:可选斜杠

$:结束符

替换为:user.php?id=*

注意:有些apache(具体哪个版本忘啦)不兼容简写模式 w => [a-zA-Z_-]

 例2(禁止IE和Opera浏览器访问):

RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L]       #'-'表示不替换URL

例3(不合法路径返回首页):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]

例4(防盗链):

RewriteEngine On
RewriteCond %{HTTP_REFERER} !^http://(. .)?mysite.com/ [NC]       #判断请求的是否是自己的域名
RewriteCond %{HTTP_REFERER} !^$                     #{HTTP_REFERER}不为空
RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]      #返回警告图片

例5(改变访问URL目录名):

即隐藏真实的目录名字

RewriteEngine On
RewriteRule ^/?old_dir/([a-z.] )$  new_dir/$1 [R=301,L]
#new_dir为真正目录

例6(创建无文件后缀链接):

RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.php -f #判断该后缀文件是否存在
RewriteRule ^/?([a-zA-Z0-9] )$ $1.php [L]
RewriteCond %{REQUEST_FILENAME}.html -f #判断该后缀文件是否存在
RewriteRule ^/?([a-zA-Z0-9] )$ $1.html [L]

例7(限制只能显示图片):

RewriteEngine on
RewriteCond %{REQUEST_FILENAME}  !^.*.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ - [F,L]

例8(文件不存在重定向404):

RewriteEngine on
RewriteCond  %{REQUEST_FILENAME}  !f
RewriteCond  %{REQUEST_FILENAME}  !d
RewriteRule .? /404.php [L]

 

 (以上是自己的一些见解与总结,若有不足或者错误的地方请各位指出)

作者:那一叶随风

声明:以上只代表本人在工作学习中某一时间内总结的观点或结论。转载时请在文章页面明显位置给出原文链接

 

二、配置.htaccess文件,定义重写规则

TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的变量结构扩展:

RewriteMap扩展:引用方法是:${mapname:key|default} 细节请参见RewriteMap指令 。

TestString可以包含服务器变量 ,引用方法是:%{NAME_OF_VARIABLE}

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

HTTP头连接与请求 服务器自身 日期和时间 其它
HTTP_USER_AGENT DOCUMENT_ROOT TIME_YEAR API_VERSION
HTTP_REFERER SERVER_ADMIN TIME_MON THE_REQUEST
HTTP_COOKIE SERVER_NAME TIME_DAY REQUEST_URI
HTTP_FORWARDED SERVER_ADDR TIME_HOUR REQUEST_FILENAME
HTTP_HOST SERVER_PORT TIME_MIN IS_SUBREQ
HTTP_PROXY_CONNECTION SERVER_PROTOCOL TIME_SEC HTTPS
HTTP_ACCEPT SERVER_SOFTWARE TIME_WDAY  
REMOTE_ADDR   TIME  
REMOTE_HOST      
REMOTE_PORT      
REMOTE_USER      
REMOTE_IDENT      
REQUEST_METHOD      
SCRIPT_FILENAME      
PATH_INFO      
QUERY_STRING      
AUTH_TYPE      

这些变量都对应于类似命名的HTTP MIME头、Apache服务器的C变量、Unix系统中的struct tm字段,其中的大多数在其他的手册或者CGI规范中都有说明。 其中有mod_rewrite所特有的变量如下:

IS_SUBREQ

如果正在处理的请求是一个子请求,它将包含字符串”true”,否则就是”false”。 模块为了解析URI中的附加文件,可能会产生子请求。

API_VERSION

这是正在使用中的Apache模块API(服务 器和模块之间内部接口)的版本, 其定义位于include/ap_mmn.h中。 此模块API版本对应于正在使用的Apache的版本(比如在Apache 1.3.14的发行版中这个值是19990320:10)。 通常,对它感兴趣的是模块的开发者。

THE_REQUEST

这是由浏览器发送的完整的HTTP请求行(比如:”GET /index.html HTTP/1.1″)。 它不包含任何浏览器发送的其它头信息。

REQUEST_URI

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

REQUEST_FILENAME

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

HTTPS

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

其它注意事项:

SCRIPT_FILENAME和 REQUEST_FILENAME包含的值是相同的——即Apache服务器内部的request_rec结构中的 filename字段。 第一个就是大家都知道的CGI变量名,而第二个则是REQUEST_URI(request_rec结构中的uri字段)的一个副本。

  1. 特殊形式:%{ENV:variable} ,其中的variable可以是任意环境变量。 它是通过查找Apache内部结构或者(如果没找到的话)由Apache服务器进程通过getenv()得到的。
  2. 特殊形式:%{SSL:variable} ,其中的variable可以是一个SSL环境变量 的名字,无论mod_ssl 模块是否已经加载都可以使用(未加载时为空字符串)。 比如:%{SSL:SSL_CIPHER_USEKEYSIZE}将会被替换为128。
  3. 特殊形式:%{HTTP:header} ,其中的header可以是任意HTTP MIME头的名称。 它总是可以通过查找HTTP请求而得到。 比如:%{HTTP:Proxy-Connection}将被替换为Proxy-Connection:HTTP头的值。
  4. 预设形式:%{LA-U:variable} ,variable的最终值在执行一个内部(基于URL的)子请求后确定。 当需要使用一个目前未知但是会在之后的过程中设置的变量的时候,就可以使用这个方法。 例如,需要在服务器级配置(httpd.conf文件)中根据REMOTE_USER变量进行重写, 就必须使用%{LA-U:REMOTE_USER}。 因为此变量是由URL重写(mod??_rewrite)步骤之后的认证步骤设置的。 但是另一方面,因为mod_rewrite是通过API修正步骤来实现目录级(.htaccess文件)配置的, 而认证步骤先于API修正步骤,所以可以用%{REMOTE_USER}。
  5. 预设形式:%{LA-F:variable} ,variable的最终值在执行一个内部(基于文件名的)子请求后确定。 大多数情况下和上述的LA-U是相同的。

1、 在配置重写规则之前,需要在httpd.conf中设置AllowOverride All(至少设置为AllowOverride FileInfo)让Apache能够正常的读取.htaccess 文件的内容。

●CondPattern是条件模式,即一个应用于当前TestString实例的正则表达式。TestString将被首先计算,然后再与CondPattern匹配。

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

1、可以在CondPattern串的开头使用”!’(惊叹号)来指定 不匹配 。
2、CondPatterns有若干特殊的变种。 除了正则表达式的标准用法,还有下列用法:

“<CondPattern”————-(词典顺序的小于)

将CondPattern视为纯字符串,与TestString按词典顺序进行比较。 如果TestString小于CondPattern则为真。
“>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,而且可以在服务器当前的访问控制配置下被访问。 它使用一个内部子请求来做检查,由于会降低服务器的性能,所以请谨慎使用!
注意: 所有这些测试都可以用惊叹号作前缀(“!”)以实现测试条件的反转。

或许比较混乱,但是这个也许是最能找到自己想要的东西了。希望对大家有用...

这些你肯定喜欢

<Directory />
    Options FollowSymLinks
    AllowOverride FileInfo
</Directory>
  • 1
  • 2
  • 3
  • 4

2、在.htaccess中定义重写规则。

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^([A-Za-z_] )$ index.php?m=$1
  • 1
  • 2
  • 3
  • 4

RewriteEngine on打开rewrite功能

RewriteCond指令格式

  • 语法: RewriteCond TestString CondPattern [flags]
  • 生效域: server config, virtual host, directory, .htaccess
  • RewriteCond指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。
  • TestString是一个纯文本的字符串,除了包含普通的字符外,还可以包括下列的可扩展结构: 
    • $N:RewriteRule后向引用,其中(0 <= N <= 9) 。$N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。
    • %N:RewriteCond后向引用,其中(0 <= N <= 9) 。%N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。
    • ${mapname:key|default}:RewriteMap扩展。
  • CondPattern是条件pattern,即一个应用于当前实例TestString的正则表达式,即TestString将会被计算然后与CondPattern匹配。作为一个标准的扩展正则式,CondPattern有以下补充:

    • 可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。
    • CondPattern中可以使用以下特殊变量: 
      • >CondPattern(大于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 的字符大于CondPattern为真。
      • =CondPattern(等于) 将condPattern当作一个普通字符串,将它和TestString进行比较,当TestString 与CondPattern完全相同时为真.如果CondPattern只是”“(两个引号紧挨在一起) 此时需TestString 为空字符串方为真。
      • -d(是否为目录) 将testString当作一个目录名,检查它是否存在以及是否是一个目录。
      • -f (是否是regular file) 将testString当作一个文件名,检查它是否存在以及是否是一个regular文件。
      • -s (是否为长度不为0的regular文件) 将testString当作一个文件名,检查它是否存在以及是否是一个长度大于0的regular文件。
      • -l (是否为symbolic link) 将testString当作一个文件名,检查它是否存在以及是否是一个 symbolic link。
      • -F(通过subrequest来检查某文件是否可访问) 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
      • -U (通过subrequest来检查某个URL是否存在) 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
  • [flags]是第三个参数,多个标志之间用逗号分隔。

    • nocase|NC (不区分大小写) 在扩展后的TestString和CondPattern中,比较时不区分文本的大小写。注意,这个标志对文件系统和subrequest检查没有影响。
    • ornext|OR(建立与下一个条件的或的关系) 默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如:

      RewriteCond %{REMOTE_HOST} ^host1.* [OR] 
      RewriteCond %{REMOTE_HOST} ^host2.* [OR] 
      RewriteCond %{REMOTE_HOST} ^host3.*
      RewriteRule … 
      
      • 1
      • 2
      • 3
      • 4

      如果没有[OR]标志,需要写三个条件/规则。

RewriteRule 指令

  • 语法: RewriteRule Pattern Substitution [flags]
  • Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的“当前”是指该规则生效时的URL的值。
  • Substitution是,当原始URL与Pattern相匹配时,用以替代(或替换)的字符串此外,Substitution还可以追加特殊标记[flags] 作为RewriteRule指令的第三个参数。
  • Flags是一个包含以逗号分隔的下列标记

    • forbidden|F (强制URL为被禁止的 forbidden) 强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。使用这个标记,可以链接若干RewriteConds以有条件地阻塞某些URL。
    • gone|G(强制URL为已废弃的 gone) 强制当前URL为已废弃的,即,立即反馈一个HTTP响应代码410(已废弃的)。使用这个标记,可以标明页面已经被废弃而不存在了.
    • proxy|P (强制为代理 proxy) 此标记使替换成分被内部地强制为代理请求,并立即(重写规则处理立即中断)把处理移交给代理模块。你必须确保此替换串是一个有效的(比如常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。使用这个标记,可以把某些远程成分映射到本地服务器名称空间,从而增强了ProxyPass指令的功能。(注意: 要使用这个功能,代理模块必须编译在Apache服务器中。如果你不能确定,可以检查“httpd -l”的输出中是否有mod_proxy.c。如果有,则mod_rewrite可以使用这个功能;如果没有,则必须启用mod_proxy并重新编译“httpd”程序。)
    • last|L (最后一个规则 last) 立即停止重写操作,并不再应用其他重写规则。它对应于Perl中的last命令或C语言中的break命令。这个标记可以阻止当前已被重写的URL为其后继的规则所重写。例如,使用它可以重写根路径的URL(’/’)为实际存在的URL, 比如, ‘/e/www/’。

    • next|N (重新执行 next round) 重新执行重写操作(从第一个规则重新开始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。它对应于Perl中的next命令或C语言中的continue命令。 此标记可以重新开始重写操作,即, 立即回到循环的头部。但是要小心,不要制造死循环!

    • chain|C (与下一个规则相链接 chained) 此标记使当前规则与下一个(其本身又可以与其后继规则相链接的, 并可以如此反复的)规则相链接。 它产生这样一个效果: 如果一个规则被匹配,通常会继续处理其后继规则, 即,这个标记不起作用;如果规则不能被匹配,则其后继的链接的规则会被忽略。比如,在执行一个外部重定向时, 对一个目录级规则集,你可能需要删除“.www” (此处不应该出现“.www”的)。

    • type|T=MIME-type(强制MIME类型type) 强制目标文件的MIME类型为MIME-type 比如,它可以用于模拟mod_alias中的ScriptAlias指令,以内部地强制被映射目录中的所有文件的MIME类型为“application/x-httpd-cgi”。
    • nosubreq|NS (仅用于不对内部子请求进行处理 no internal sub-request) 在当前请求是一个内部子请求时,此标记强制重写引擎跳过该重写规则。比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。
    • nocase|NC (忽略大小写 no case) 它使Pattern忽略大小写,即, 在Pattern与当前URL匹配时,’A-Z’ 和’a-z’没有区别。
    • qsappend|QSA (追加请求串 query string append) 此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
    • noescape|NE (在输出中不对URI作转义 no URI escaping) 此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 一般情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记可以阻止这样的转义,以允许百分号等符号出现在输出中,如: 
      RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE] 可以使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’
    • passthrough|PT (移交给下一个处理器 pass through) 此标记强制重写引擎将内部结构request_rec中的uri字段设置为 filename字段的值,它只是一个小修改,使之能对来自其他URI到文件名翻译器的 Alias,ScriptAlias, Redirect 等指令的输出进行后续处理。举一个能说明其含义的例子:如果要通过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,可以这样:

      RewriteRule ^/abc(.*) /def$1 [PT]
      Alias /def /ghi
      
      • 1
      • 2

      如果省略了PT标记,虽然mod_rewrite运作正常,即作为一个使用API的URI到文件名翻译器,它可以重写uri=/abc/…为filename=/def/…,但是,后续的mod_alias在试图作URI到文件名的翻译时,则会失效。

    • skip|S=num (跳过后继的规则 skip) 此标记强制重写引擎跳过当前匹配规则后继的num个规则。 它可以实现一个伪if-then-else的构造: 最后一个规则是then从句,而被跳过的skip=N个规则是else从句. (它和’chain|C’标记是不同的!)

    • env|E=VAR:VAL (设置环境变量 environment variable) 此标记使环境变量VAR的值为VAL, VAL可以包含可扩展的反向引用的正则表达式$N和%N。此标记可以多次使用以设置多个变量。这些变量可以在其后许多情况下被间接引用,但通常是在XSSI (via ) or CGI (如 $ENV{’VAR’})中, 也可以在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。使用它可以从URL中剥离并记住一些信息。

    • cookie|CO=NAME:VAL:domain[:lifetime[:path]] (设置cookie)它在客户端浏览器上设置一个cookie。cookie的名称是NAME,其值是VAL。domain字段是该cookie的域,比如’.apache.org’, 可选的lifetime是cookie生命期的分钟数,可选的path是cookie的路径。

       此外,rewrite规则中如果遇到中文,相当有可能会出现乱码问题,因为apache在rewrite时会做一次url解码,这时jk进行请求转发时,就不会再是编码后的字符串了。此种情况,可以在一开始就进行两次编码(encode),或者在接收请求时先用ISO-8859-1取字节流,再使用UFT-8来new String。

三、解决网站不在根目录Apache解析路径出错的问题

若果网站程序不在根目录,那么伪静态的URL就容易出错,解决方法是配置虚拟主机

1、在httpd.conf中加载httpd-vhosts.conf文件

 #Virtual hosts
Include conf/extra/httpd-vhosts.conf
  • 1
  • 2

2、在httpd-vhosts.conf文件中配置虚拟主机

<VirtualHost *:80>
    ServerAdmin webmaster@dummy-host.example.com
    DocumentRoot /www/docs/dummy-host.example.com #项目路径
    ServerName dummy-host.example.com             #ServerName
    ErrorLog logs/dummy-host.example.com-error_log
    CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、在hosts中加载serverName

       总之,要通过Apache服务器实现伪静态,首先要在httpd.conf中加载mod_rewrite.so模块,然后配置RewriteRule。当然,在定义RewriteRule之前弄明白网站动态的URL有哪几类,要匹配的静态URL的类型,才能更好更快的写出适合自己网站的RewriteRule。

本文由澳门新萄京官方网站发布于www.8455.com,转载请注明出处:Rewrite法则简单介绍,APACHE服务器500漏洞非常多搞

关键词: