规则介绍,APACHE服务器500荒唐消除方法与强制跳转

1、简介

  Apached的重写作用,便是mod_rewrite模块成效,它是apache的贰个模块。它的机能十一分强大,能够操作U卡宴L中的全部片段。

  因而大家就足以改写url,给用户提供1个简单介绍大方的url,当用户访问时可以经过mod_rewrite模块功用转移为实在的财富路线。通过mod_rewrite能促成的效应还有不少,比方隐藏真实地址、达成U卡宴L跳转、域名跳转、防盗链、限制访问能源类型等等。

伪静态的发生非常重借使为着进步寻找引擎的友好度,方便用户记念。一般经过正则相配来重写动态网址的U昂科拉L使其静态化。那么在Windows平台下何以设置Apache援助U大切诺基L重写功用,以及哪些配置.htaccess文件来贯彻伪静态呢?

apache 模块mod_rewrite
提供了2个依照正则表明式分析器的重写引擎来实时重写UHummerH二L请求。
它补助每一个完整规则能够具有不限数量的子规则以及附加条件规则的利落而且有力的U瑞鹰L操作机制。
此U中华VL操作能够依据于种种测试,举个例子服务器变量、意况变量、HTTP头、时间标志,以致种种格式的用于相配UEnclaveL组成都部队分的搜寻数据库。
 
 
此模块能够操作UHummerH二L的装有片段(蕴涵路线音信部分),在劳务器级的(httpd.conf)和目录级的(.
htaccess )配置都使得,还可以够转换最后请求字符串。
此重写操作的结果能够是内部子管理,也足以是外部请求的转速,以致还足以是内部代理管理。
此地首要介绍一下RewriteCond
的规则以及参数表达。RewriteCond指令定义了平整生效的条件,即在二个RewriteRule指令在此之前能够有3个或三个RewriteCond指令。
条件现在的重写规则仅在近期U酷路泽I与Pattern相配并且满意此处的尺码(TestString能够与CondPattern相配)时才会起成效。
【表明】定义重写发生的标准
【语法】RewriteCond TestString CondPattern [flags]
【作用域】server config, virtual host, directory, .htaccess
【覆盖项】FileInfo
【状态】 扩展(E)
【模块】mod_rewrite
TestString是1个纯文本的字符串,然则还足以包涵下列可扩展的成份:
RewriteRule反向引用 ,引用方法是:$N (0 <= N <=
玖)引用当前(带有若干RewriteRule指令的)RewriteCond中的与Pattern相配的分组成分(圆括号!)。
RewriteCond反向引用 ,引用方法是:%N (一 <= N <=
九)引用当前多少RewriteCond条件中最终符合的基准中的分组成分(圆括号!)。
RewriteMap增添 ,引用方法是:${mapname:key|default}
细节请参见RewriteMap指令 。
服务器变量 ,引用方法是:%{NAME_OF_VARIABLE}
NAME_OF_VA卡宴IABLE能够是下表列出的字符串之壹:
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_规则介绍,APACHE服务器500荒唐消除方法与强制跳转。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
只要正在管理的呼吁是2个子伸手,它将涵盖字符串”true”,不然就是”false”。
模块为理解析UOdysseyI中的附加文件,只怕会爆发子请求。
API_VERSION
那是正在利用中的Apache模块API(服务器和模块之间内部接口)的版本,
其定义位于include/ap_mmn.h中。
此模块API版本对应高满堂在利用的Apache的本子(比方在Apache
1.叁.1四的发行版中那么些值是1九九九0320:10)。
日常,对它感兴趣的是模块的开采者。
THE_REQUEST
那是由浏览器发送的1体化的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包括的值是同1的——即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}将会被交流为12八。
出奇格局:%{HTTP:header} ,个中的header能够是率性HTTP MIME头的称呼。
它连接能够透过搜寻HTTP请求而赢得。
比方:%{HTTP:Proxy-Connection}将被交换为Proxy-Connection:HTTP头的值。
预设形式:%{LA-U:variable}
,variable的终极值在实行3当中间(基于ULX570L的)子请求后分明。
当需求利用二个脚下鲜为人知但是会在其后的长河中设置的变量的时候,就足以应用那一个法子。
比方,供给在服务器级配置(httpd.conf文件)中依据REMOTE_USE大切诺基变量进行重写,
就必须使用%{LA-U:REMOTE_USE宝马X5}。
因为此变量是由URubiconL重写(mod??_rewrite)步骤之后的表达手续设置的。
不过1派,因为mod_rewrite是通过API考订步骤来兑现目录级(.htaccess文件)配置的,
而认证手续先于API修正步骤,所以可以用%{REMOTE_USER}。
预设情势:%{LA-F:variable}
,variable的末段值在施行四个里边(基于文件名的)子请求后明确。
大繁多动静下和上述的LA-U是千篇1律的。
 
CondPattern是规范格局,即一个应用于目前TestString实例的正则表明式。TestString将被第三总括,然后再与CondPattern匹配。
在意:CondPattern是贰个perl包容的正则表明式,可是还有诸多互补:
一、能够在CondPattern串的起始使用’!'(惊叹号)来指定 不匹配 。
二、CondPatterns有若干非同一般的变种。
除了正则表达式的专门的工作用法,还有下列用法:
‘<CondPattern ‘(词典顺序的小于)
将Cond帕特tern视为纯字符串,与TestString按词典顺序进行比较。
假如TestString小于CondPattern则为真。
‘>CondPattern ‘(词典顺序的超越)
将CondPattern视为纯字符串,与TestString按词典顺序进行比较。
倘诺TestString大于Cond帕特tern则为真。
‘=CondPattern ‘(词典顺序的卓殊)
将CondPattern视为纯字符串,与TestString按词典顺序进行相比较。
若是TestString等于CondPattern(八个字符串每个字符地完全相等)则为真。
假设CondPattern是””(四个双引号),则TestString将与空字符串举办比较。
‘-d ‘(目录)
将TestString视为二个门路名并测试它是还是不是为二个存在的目录。
‘-f ‘(常规文件)
将TestString视为3个途径名并测试它是还是不是为多个存在的平常文件。
‘-s ‘(非空的正规文件)
将TestString视为三个门路名并测试它是还是不是为1个存在的、尺寸大于0的符合规律文件。
‘-l ‘(符号连接)
将TestString视为一个门路名并测试它是否为一个存在的号子连接。
‘-x ‘(可执行)
将TestString视为2个路径名并测试它是否为二个留存的、具有可实行权限的文书。
该权限由操作系统一检查测。
‘-F ‘(对子请求存在的文书)
检查TestString是还是不是为叁个卓有作用的文书,而且能够在服务器当前的访问调整配置下被访问。
它应用多个内部子请求来做检查,由于会稳中有降服务器的天性,所以请谨慎接纳!
‘-U ‘(对子请求存在的U大切诺基L)
自己探讨TestString是还是不是为二个管用的UHummerH二L,而且能够在服务器当前的访问调节配置下被访问。
它选取三个内部子请求来做检讨,由于会回落服务器的品质,所以请小心选拔!
专注: 全数这个测试都得以用好奇号作前缀(‘!’)以贯彻测试条件的反转。
3、仍可以在CondPattern之后追加特殊的标识[flags]
作为RewriteCond指令的第三个参数。flags是叁个以逗号分隔的以下标志的列表:
‘nocase|NC ‘(忽略大小写)
它使测试忽略大小写,扩张后的TestString和CondPattern中’AZ’
和’a-z’是未有区别的。
此标识仅用于TestString和CondPattern的相比,而对文件系统和子请求的反省不起成效。
‘ornext|OCR-V ‘(或下一条件)
它以OLAND形式结合若干规则的尺度,而不是含有的AND。 标准的例子如下:
RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule
…针对这二个主机的条条框框集…假若不用那一个符号,你就必须求书写二次口径/规则对。
举例
一经要按请求头中的”User-Agent:”重写2个站点的主页,能够这么写:
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等等)。
万一上述规范都不满意(使用的是任何浏览器),则你获得的是二个标准的主页。

2、专业流程

  mod_rewrite模块在运转时会使用四个Hook程序。

  第伍个是从UHummerH二L到文件名转移的Hook。当有访问达到Apache服务器的时,服务器会确认相应主机(或虚拟主机),那时mod_rewrite模块就起来专门的学问,它将会先拍卖服务器全局中mod_rewrite模块所提供的一声令下,然后依照用户提供的一声令下展开改写。

  第一个是校正U宝马X3L的Hook。在此阶段mod_rewrite模块会管理非全局的安装。比方,目录中的.htaccess文件中的设置。可是此时早已成功U揽胜极光L的翻译(由U昂科雷L调换为文件名),因而是心有余而力不足在次对目录等级的UPRADOL进行改写操作,不过moe_rewrite模块会将已翻译的U汉兰达L再一次转移为U路虎极光L的意况,继续开始展览目录级其他U奥迪Q5L改写。(mod_rewrite模块将会选取读后请求阶段的回叫函数重新早先贰个伸手的大循环处理)

Rewirte模块规则集的拍卖

澳门葡京备用网址,  当mod_rewrite在那三个API阶段中初阶实行时,它会读取配置结构中配备好的
(或许是在劳动运行时建构的劳动器级的,或然是在遍历目录搜集到的目录级的)规则集,然后,运营U帕JeroL重写引擎来拍卖(带有三个或七个规范化的)规则集。无论是服务器级的照旧目录级的规则集,都以由同七个UQX56L重写引擎管理,只是最后结出处理不一致而已。

  规则聚焦规则的依次是很要紧的,因为重写引擎是按1种万分的次第管理的:每个遍历每种规则(RewriteRule指令),若是现身叁个才子佳人原则的规则,则大概回头遍历已有个别规则条件(RewriteCond指令)。由于历史的原由,条件规则是停放的,所以决定流程略显冗长,细节见图-一。

澳门葡京备用网址 1

  可知,UTucsonL首先与各样规则的Pattern匹配,若是协作战败,mod_rewrite将马上停下此规则的拍卖,继而管理下1个规则。假设合营成功,mod_rewrite将追寻对应的条条框框条件,如若2个规范都未有,则轻便地用Substitution构造的新值来替换U奥迪Q7L,然后继续处理别的规则;不过假如基准存在,则始于多个里面循环按其列出的相继每种管理。对规则条件的拍卖有所分化:U翼虎L并不与情势张开匹配,而是首先通过扩展变量、反向引用、查找映射表等手续创建1个TestString字符串,然后用它来与CondPattern匹配。假使相称退步,则全部条件集和呼应的规则战败;就算协作成功,则推行下1个平整直到全体条件实践落成。假使持有条件能够相称,则以Substitution替换URubiconL,并且继续管理。(本有的引用译者:金步国)

网络图片:

澳门葡京备用网址 2

 

一、让Apache支持URL重写

摘自 第零空间

三、U福睿斯L重写指令

  最轻便易行的重写指令能够简轻易单到让你无法想像!

  只供给两步就足以做到了。第3采取RewriteEngine开启mod_rewrite模块成效;第一透过RewriteRule定义U帕杰罗L重写规则

     
 在httpd.conf中加载mod_rewrite.so零件开启Apache中的U帕杰罗L重写功效。

模块mod_rewrite
提供了3个根据正则表达式分析器的重写引擎来实时重写U讴歌RDXL请求。
它辅助各种完整规则可以具备不限数量的子规则以及附…

  一)、ULX570L重写指令套路

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文件,定义重写规则

  2)、RewriteRule Pattern Substitution [flags]

  壹、pattern是效能于当下U帕杰罗L的perl兼容的正则表达式。当前URL是指该规则生效时刻的UTiggoL的值。它或然与被呼吁时的USportageL南辕北辙,因为事先大概被其它RewriteRule也许alias指令修改过。

  2、Substitution是当U大切诺基L与Pattern相配成功后。用来取代的字符串。

  • 能够对pattern反向引用$N(N=0~九),表示正则表明式中第N个括号中的内容
  • 对终极相称的RewriteCond反向引用%N(N=0~九),表示最后相称的RewriteCond第N对括号中的内容
  • 服务器变量%{VAQashqaiNAME}
  • 映射函数调用${mapname:key|default}
    (通过RewriteMap指令定义映射协助落成)

  3、[flags],标记符,多少个则用逗号隔绝。

标记符(摘抄于网络):

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

  以 )
为前缀的Substitution能够强制性施行多个外部重定向。
假诺code未有点名,则发出2个HTTP响应代码302(权且性移动)。倘若急需利用在300-400范围内的其他响应代码,只需在此钦定这些数值就能够,
其余,还足以使用下列符号名称之1: temp (暗许的), permanent, seeother.
用它能够把标准化的URAV④L反馈给客户端,如, 重写“/~”为
“/u/”,或对/u/user加上斜杠,等等。

注意: 在应用那么些标识时,必须保险该替换字段是二个管用的UBMWX五L!
不然,它会指向贰个无效的岗位! 并且要铭记在心,此标记自个儿只是对U讴歌RDXL加上
.

forbidden|F (强制U揽胜极光L为被明确命令禁止的 forbidden)

  强制当前UPRADOL为被取缔的,即,马上反馈叁个HTTP响应代码40三(被禁止的)。使用这么些符号,能够链接若干RewriteConds以有规则地打断有个别UHavalL。

gone|G(强制U景逸SUVL为已放弃的 gone)

  强制当前U猎豹CS陆L为已吐弃的,即,马上上报四个HTTP响应代码肆拾(已扬弃的)。使用那些标识,能够申明页面已经被放弃而不存在了.

proxy|P (强制为代理 proxy)

  此标识使替换到分被里面地强制为代理请求,并随即(即,
重写规则管理当下暂停)把拍卖移交给代理模块。你必须保障此替换串是贰个有效的(比如大规模的以

从而巩固了ProxyPass指令的成效。

专注: 要使用那一个意义,代理模块必须编写翻译在Apache服务器中。
假让你不能鲜明,能够检查“httpd -l”的出口中是或不是有mod_proxy.c。
如果有,则mod_rewrite能够运用那么些效果;假如未有,则必须启用mod_proxy同仁一视复编写翻译“httpd”程序。

last|L (最后三个平整 last)

  立即停下重写操作,并不再行使别的重写规则。
它对应于Perl中的last命令或C语言中的break命令。这些标识可以阻碍当前已被重写的U福特ExplorerL为其后继的规则所重写。
比方,使用它能够重写根路径的U途睿欧L(’/’)为实在存在的U奇骏L, 比如, ‘/e/www/’.

next|N (重新推行 next round)

  重新实践重写操作(从第一个规则重新开头).
那时再一次张开管理的ULacrosseL已经不是原来的U中华VL了,而是经最后1个重写规则管理的U凯雷德L。它对应于Perl中的next命令或C语言中的continue命令。
此标志能够再一次发轫重写操作,即, 立时回到循环的头部。
只是要小心,不要创设死循环!

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

  此标记使当前规则与下3个(其自身又足以与其后继规则相链接的,
并能够这么反复的)规则相链接。 它发出如此三个效果:
假设多个规则被相配,经常会接二连三管理其后继规则,
即,那几个标志不起功用;借使规则无法被相配,则其后继的链接的规则会被忽略。比如,在试行三个外表重定向时,
对三个目录级规则集,你只怕必要删除“.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)

  在时下伏乞是2个内部子请求时,此标识强制重写引擎跳过该重写规则。比如,在mod_include试图搜索或然的目录默许文件(index.xxx)时,
Apache会内部地发生子请求。对子请求,它不明确有用的,而且只要整个规则集都起功能,它竟然恐怕会引发错误。所以,能够用这么些符号来消除某个规则。

  依照你的急需依据以下规则:
若是你采纳了有CGI脚本的U科雷傲L前缀,以强制它们由CGI脚本管理,而对子请求管理的出错率(大概支付)非常高,在这种意况下,可以应用这些标志。

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

  它使Pattern忽略大小写,即, 在Pattern与当下U大切诺基L相配时,’A-Z’
和’a-z’未有区分。

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

  此标记强制重写引擎在已部分替换串中追加贰个呼吁串,而不是粗略的轮换。假诺需求通过重写规则在乞求串中扩充信息,就可以利用这一个符号。

noescape|NE (在出口中不对USportageI作转义 no URAV4I escaping)

  此标记阻止mod_rewrite对重写结果使用常规的UPRADOI转义规则。
一般情形下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十6进制编码。
此标识能够阻碍那样的转义,以允许百分号等标记出现在出口中,如:

  RewriteRule /foo/(.*) /bar?arg=P1=$1 [R,NE]
能够使’/foo/zed’转向到三个有惊无险的伸手’/bar?arg=P一=zed’.

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

  此标记强制重写引擎将内部结构request_rec中的uri字段设置为
filename字段的值,它只是一个小修改,使之能对来自别的ULX570I到文件名翻译器的
Alias,ScriptAlias, Redirect
等一声令下的输出举办三番五次管理。举一个能证实其意义的事例:要是要透过mod_rewrite的重写引擎重写/abc为/def,然后通过mod_alias使/def转变为/ghi,能够这么:

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

Alias /def /ghi
  倘使简单了PT标识,固然mod_rewrite运作日常, 即,
作为贰个使用API的UPAJEROI到文件名翻译器,它能够重写uri=/abc/…为filename=/def/…,但是,后续的mod_alias在希图作U中华VI到文件名的翻译时,则会失灵。

专注: 若是必要混合使用区别的盈盈UHummerH二I到文件名翻译器的模块时,
就亟须选取这么些标志。。混合使用mod_alias和mod_rewrite便是个规范的例证。

For Apache hackers

  要是当前Apache
API除了U福睿斯I到文件名hook之外,还有二个文本名到文件名的hook,
就不必要这几个符号了!
然则,倘诺未有这么1个hook,则此标识是无可比拟的缓和方案。 Apache
Group探讨过那些主题材料,并在Apache 2.0 版本中会扩充那样多个hook。

skip|S=num (跳过后继的平整 skip)

  此标识强制重写引擎跳过当前协作规则后继的num个规则。
它能够兑现七个伪if-then-else的结构:
最终贰个平整是then从句,而被跳过的skip=N个规则是else从句.
(它和’chain|C’标志是差别的!)

env|E=VACRUISER:VAL (设置处境变量 environment variable)

  此标记使景况变量VA帕杰罗的值为VAL,
VAL可以包含可扩张的反向引用的正则表明式$N和%N。
此标志能够屡屡应用以设置七个变量。那么些变量能够在其后好多状态下被直接引用,但普通是在XSSI
(via ) or CGI (如 $ENV{’VACR-V’})中,
也足以在后继的RewriteCond指令的pattern中通过%{ENV:VA本田UR-V}作引用。使用它能够从U奥德赛L中脱离并记住一些音讯。

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

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

1、 在配备重写规则在此以前,须要在httpd.conf中设置AllowOverride
All(至少设置为AllowOverride FileInfo)让Apache能够健康的读取.htaccess
文件的内容。

  3)、RewriteCond TestString CondPattern [flags]

  Rewritecond指令定义一条规则条件。在一条rewriterule指令前面大概会有一条大概多条rewritecond指令,唯有当自身模板相称成功且这几个条件也知足时(即RewriteRule中的pattern相称成功),规则条件才被使用于最近U途乐L管理。

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

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

  2、CondPattern是规范pattern,一个行使于目前实例TestString的正则表明式。即TestString与原则pattern条件实行相称。假设相配则RewriteCond的值为途乐rue,反之为False

可以选择以下特殊变量(可使用’!’完毕反转):

‘>CondPattern’ (大于)
将condPattern当作一个惯常字符串,将它和TestString实行对比,当TestString
的字符大于CondPattern为真。

‘=CondPattern’ (等于)
将condPattern当作3个习认为常字符串,将它和TestString实行比较,当TestString
与CondPattern完全同样时为真.尽管CondPattern只是 “” (四个引号紧挨在同步)
此时需TestString 为空字符串方为真。

‘-d’ (是不是为目录)
将testString当作2个目录名,检查它是或不是存在以及是还是不是是二个索引。

‘-f’ (是还是不是是regular file)
将testString当作3个文本名,检查它是或不是存在以及是不是是三个regular文件。

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

‘-l’ (是不是为symbolic link)
将testString当作2个文本名,检查它是否存在以及是或不是是3个 symbolic link。

‘-F’ (通过subrequest来检查某文件是还是不是可访问)
检查TestString是不是是二个合法的文件,而且通过服务器范围内的日前设置的访问调控进行走访。这一个检查是透过1个里边subrequest实现的,
因而供给小心使用这一个效应以下降服务器的习性。

‘-U’ (通过subrequest来检查有个别U本田CR-VL是不是留存)
检查TestString是或不是是多个法定的U帕杰罗L,而且通过服务器范围内的此时此刻设置的访问调节进行走访。这么些检查是通过一个中间subrequest完结的,
由此须要小心使用这一个效用以降低服务器的习性。

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

’nocase|NC’ (不区分轻重缓急写)
  在扩张后的TestString和CondPattern中,相比较时不区分文本的大大小小写。注意,那个标记对文件系统和subrequest检查未有影响.

’ornext|OR’ (创设与下八个原则的或的关联)
  私下认可的场地下,一个原则之间是AND的关系,用这些标记将关联改为OCRUISER。

 

  伪静态的发出至关心珍重如若为着加强寻找引擎的友好度,方便用户纪念。一般经过正则相配来重写动态网址的U奇骏L使其静态化。那么在Windows平台下哪些设置Apache辅助U昂科威L重写功效,以及如何配置.htaccess文件来贯彻伪静态呢?

  四)、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重写

  五)、轻巧正则表明式规则

. 相配任何单字符

[chars] 相称字符串:chars

[^chars] 不相称字符串:chars

text一|text贰 可挑选的字符串:text①或text贰

? 匹配0到1个字符

* 相配0到四个字符

+ 相配1到五个字符

^ 字符串发轫标识

$ 字符串甘休标记

\n 转义符标记

 【注意】:一代Apache渴求U大切诺基L有斜杠而贰代Apache却不允许,由此使用 ^/?

 

     
 在httpd.conf中加载mod_rewrite.so零件开启Apache中的UHighlanderL重写作用。

四、例子解析

例一(轻巧例子):

(在.htaccess里展开规章制度重写)

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

^:输入的始发  以user/开端请求的地点

(w+):提取全数的假名,传给$一

/?:可选斜杠

$:结束符

替换为:user.php?id=*

小心:有个别apache(具体哪个版本忘啦)不般配简写格局 w+ =>
[a-zA-Z_-]

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

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

例叁(违法途径再次回到首页):

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(改动访问UCRUISERL目录名):

即潜伏真实的目录名字

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]

例七(限制只好显示图片):

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

例八(文件不设有重定向404):

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

 

 (以上是自个儿的部分见识与总括,若有欠缺也许不当的地点请各位建议)

作者:那一叶随风

宣示:以上只表示作者在劳作学习中某目前间内总结的观念或结论。转发时请在篇章页面明显地点给出原来的书文链接

 

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

壹、 在布置重写规则从前,供给在httpd.conf中设置AllowOverride
All(至少设置为AllowOverride FileInfo)让Apache能够健康的读取.htaccess
文件的开始和结果。

<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)相配成功且这么些规则也知足时规则才被采纳于当下U宝马7系L管理。
  • TestString是3个纯文本的字符串,除了饱含普通的字符外,还足以包涵下列的可扩大结构: 
    • $N:RewriteRule后向引用,个中(0
      <= N <= 九) 。$N引用紧跟在RewriteCond后边的RewriteRule中模板中的括号中的模板在当前U福睿斯L中相称的数量。
    • %N:RewriteCond后向引用,在那之中(0 <= N <= 9)
      。%N引用最终二个RewriteCond的沙盘中的括号中的模板在方今U路虎极光L中相称的数据。
    • ${mapname:key|default}:RewriteMap扩展。
  • CondPattern是条件pattern,即二个选用于近来实例TestString的正则表明式,即TestString将会被总结然后与CondPattern相称。作为二个行业内部的恢宏正则式,CondPattern有以下补充:

    • 能够在模板串前扩展1个!前缀,以用表示区别盟模板。但并不是兼具的test都足以加!前缀。
    • CondPattern中得以应用以下特殊变量: 
      • >CondPattern(大于) 将condPattern当作叁个家常字符串,将它和TestString实行相比,当TestString
        的字符大于CondPattern为真。
      • =CondPattern(等于) 将condPattern当作贰个见惯不惊字符串,将它和TestString举办比较,当TestString
        与CondPattern完全一样时为真.倘诺CondPattern只是”“(三个引号紧挨在一齐)
        此时需TestString 为空字符串方为真。
      • -d(是还是不是为目录) 将testString当作二个目录名,检查它是还是不是留存以及是不是是二个索引。
      • -f (是否是regular
        file)
         将testString当作1个文本名,检查它是否留存以及是或不是是3个regular文件。
      • -s
        (是或不是为长度不为0的regular文件)
         将testString当作三个文书名,检查它是或不是存在以及是不是是一个长短大于0的regular文件。
      • -l (是否为symbolic
        link)
         将testString当作2个文本名,检查它是否存在以及是还是不是是2个symbolic link。
      • -F(通过subrequest来检查某文件是还是不是可访问) 检查TestString是还是不是是两个法定的公文,而且通过服务器范围内的当前安装的访问调控进行走访。那个检查是经过3个里面subrequest达成的,
        由此需求小心使用这些意义以减低服务器的天性。
      • -U
        (通过subrequest来检查有些U大切诺基L是不是留存)
         检查TestString是不是是2个法定的ULacrosseL,而且经过服务器范围内的目前安装的访问调节进行访问。这么些检查是经过3个里面subrequest达成的,
        因此要求小心使用那几个功能以下落服务器的质量。
  • [flags]是第七个参数,多少个标识之间用逗号分隔。

    • nocase|NC
      (不区分轻重缓急写)
       在扩充后的TestString和CondPattern中,相比时不区分文本的大小写。注意,那几个标记对文件系统和subrequest检查未有影响。
    • ornext|O凯雷德(创建与下3个准绳的或的关系) 暗中同意的景况下,三个标准之间是AND的关联,用那几个标记将涉及改为OXC90。举例:

      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是二个效能于近期U凯雷德L的卓殊perl的正则表明式.
    这里的“当前”是指该规则生效时的ULANDL的值。
  • Substitution是,当原始U本田UR-VL与Pattern相相称时,用以代表(或调换)的字符串别的,Substitution还能扩充特殊标志[flags]
    作为RewriteRule指令的首个参数。
  • Flags是1个暗含以逗号分隔的下列标识

    • forbidden|F (强制U瑞虎L为被取缔的
      forbidden)
       强制当前U奇骏L为被明令禁止的,即,登时上报二个HTTP响应代码403(被禁止的)。使用这一个符号,能够链接若干RewriteConds以有规则地打断某个UOdysseyL。
    • gone|G(强制U福睿斯L为已甩掉的
      gone)
       强制当前U昂CoraL为已吐弃的,即,立刻反馈三个HTTP响应代码四10(已甩掉的)。使用那个标识,能够表明页面已经被甩掉而不存在了.
    • proxy|P (强制为代理
      proxy)
       此标志使替换到分被内部地强制为代理请求,并当即(重写规则管理当下暂停)把拍卖移交给代理模块。你不能不确定保证此替换串是二个得力的(举个例子大规模的以 http://hostname发端的)能够为Apache代理模块所拍卖的U奥迪Q3I。使用这几个标志,能够把有些远程成分映射到地头服务器名称空间,从而加强了ProxyPass指令的功力。(注意:
      要使用那个效果,代理模块必须编写翻译在Apache服务器中。借使您不可能鲜明,能够检查“httpd
      -l”的输出中是还是不是有mod_proxy.c。如果有,则mod_rewrite能够行使那个功用;假诺未有,则必须启用mod_proxy并再一次编写翻译“httpd”程序。)
    • last|L (最后一个规则
      last)
       立时停下重写操作,并不再行使其余重写规则。它对应于Perl中的last命令或C语言中的break命令。那一个符号能够阻止当前已被重写的U凯雷德L为其后继的条条框框所重写。举个例子,使用它能够重写根路线的U帕杰罗L(’/’)为实际存在的UPAJEROL,
      比方, ‘/e/www/’。

    • next|N (重新实行 next
      round)
       重新试行重写操作(从第三个规则重新先河).
      那时再度进行拍卖的U君越L已经不是原来的U奥迪Q伍L了,而是经最后二个重写规则管理的UPRADOL。它对应于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)
       在眼下呼吁是3个内部子请求时,此标识强制重写引擎跳过该重写规则。比方,在mod_include试图寻找可能的目录暗许文件(index.xxx)时,
      Apache会内部地产生子请求。对子请求,它不确定有用的,而且假使全勤规则集都起效果,它竟然可能会吸引错误。所以,可以用这几个标志来解除有个别规则。依照你的须求根据以下原则:
      要是您利用了有CGI脚本的U科雷傲L前缀,以强制它们由CGI脚本处理,而对子请求管理的出错率(或许开辟)非常高,在这种情状下,能够利用这么些标志。
    • nocase|NC (忽略大小写 no case) 它使Pattern忽略大小写,即,
      在Pattern与目前U逍客L相配时,’A-Z’ 和’a-z’未有区分。
    • qsappend|QSA (追加请求串 query string
      append)
       此标识强制重写引擎在已有个别替换串中追加一个呼吁串,而不是粗略的交替。假使须要经过重写规则在乞求串中扩展消息,就能够运用那些符号。
    • noescape|NE (在出口中不对U安德拉I作转义 no UQashqaiI
      escaping)
       此标识阻止mod_rewrite对重写结果运用常规的U瑞鹰I转义规则。
      一般景况下,特殊字符(如’%’, ‘$’,
      ‘;’等)会被转义为等值的十6进制编码。
      此标识能够阻碍那样的转义,以允许百分号等标志出现在出口中,如: 
      RewriteRule /foo/(.*) /bar?arg=P1\=$1 [R,NE]
      能够使’/foo/zed’转向到三个平安的请求’/bar?arg=P一=zed’
    • passthrough|PT (移交给下3个计算机 pass
      through)
       此标志强制重写引擎将内部结构request_rec中的uri字段设置为
      filename字段的值,它只是3个小修改,使之能对来自其余UHighlanderI到文件名翻译器的
      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的UENCOREI到文件名翻译器,它能够重写uri=/abc/…为filename=/def/…,不过,后续的mod_alias在筹算作UTiguanI到文件名的翻译时,则会失效。

    • skip|S=num (跳过后继的平整
      skip)
       此标识强制重写引擎跳过当前杰出规则后继的num个规则。
      它能够达成一个伪if-then-else的结构:
      最终2个条条框框是then从句,而被跳过的skip=N个规则是else从句.
      (它和’chain|C’标志是不一样的!)

    • env|E=VASportage:VAL (设置碰着变量 environment
      variable)
       此标识使景况变量VASportage的值为VAL,
      VAL能够包含可扩展的反向引用的正则说明式$N和%N。此标识可以屡屡应用以设置四个变量。那些变量能够在其后大多状态下被直接引用,但普通是在XSSI
      (via ) or CGI (如 $ENV{’VATiggo’})中,
      也足以在后继的RewriteCond指令的pattern中通过%{ENV:VAHighlander}作引用。使用它能够从U宝马X3L中退出并记住一些新闻。

    • 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-885玖-一取字节流,再使用UFT-八来new
String。

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

比如网址先后不在根目录,那么伪静态的U揽胜L就轻松失误,化解措施是安顿虚拟主机

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

 #Virtual hosts
Include conf/extra/httpd-vhosts.conf
  • 1
  • 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在此以前弄领会网址动态的UTiggoL有哪几类,要协作的静态USportageL的类型,才干更加好越来越快的写出符合自个儿网址的RewriteRule。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website