📄 1274.html
字号:
RewriteMap 扩展: 引用方法是<br>
${mapname:key|default}<br>
<br>
细节请参见the documentation for RewriteMap。<br>
服务器变量: 引用方法是<br>
%{ NAME_OF_VARIABLE }<br>
<br>
NAME_OF_VARIABLE可以是下表列出的字符串之一: HTTP headers: connection & request:<br>
HTTP_USER_AGENT<br>
HTTP_REFERER<br>
HTTP_COOKIE<br>
HTTP_FORWARDED<br>
HTTP_HOST<br>
HTTP_PROXY_CONNECTION<br>
HTTP_ACCEPT<br>
REMOTE_ADDR<br>
REMOTE_HOST<br>
REMOTE_USER<br>
REMOTE_IDENT<br>
REQUEST_METHOD<br>
SCRIPT_FILENAME<br>
PATH_INFO<br>
QUERY_STRING<br>
AUTH_TYPE<br>
<br>
server internals: system stuff: specials:<br>
DOCUMENT_ROOT<br>
SERVER_ADMIN<br>
SERVER_NAME<br>
SERVER_ADDR<br>
SERVER_PORT<br>
SERVER_PROTOCOL<br>
SERVER_SOFTWARE<br>
TIME_YEAR<br>
TIME_MON<br>
TIME_DAY<br>
TIME_HOUR<br>
TIME_MIN<br>
TIME_SEC<br>
TIME_WDAY<br>
TIME<br>
API_VERSION<br>
THE_REQUEST<br>
REQUEST_URI<br>
REQUEST_FILENAME<br>
IS_SUBREQ<br>
<br>
<br>
这些都对应于类似命名的HTTP MIME头、Apache服务器的C变量以及Unix系统中的 struct tm字段,大多数都在其他的手册或者CGI规范中有所讲述。 而其中为mod_rewrite所特有的变量有:<br>
<br>
IS_SUBREQ<br>
如果正在处理的请求是一个子请求,它包含字符串"true",否则就是"false"。 模块为了解析URI中的附加文件,有可能会产生子请求。<br>
API_VERSION<br>
这是正在使用的httpd中(服务器和模块之间内部接口)的Apache模块API的版本, 其定义位于include/ap_mmn.h中。mod_rewrite模块版本对应于正在使用的Apache的版本 (比如,在Apache 1.3.14的发行版中,这个值是19990320:10)。 通常,对它感兴趣的是模块的作者。<br>
THE_REQUEST<br>
这是由浏览器发送给服务器的完整的HTTP请求行。(比如, "GET /index.html HTTP/1.1"). 它不包含任何浏览器发送的附加头信息。<br>
REQUEST_URI<br>
这是在HTTP请求行中所请求的资源。(比如上述例子中的"/index.html".)<br>
REQUEST_FILENAME<br>
这是与请求相匹配的完整的本地文件系统的文件路径名或描述.<br>
特别注意事项:<br>
<br>
SCRIPT_FILENAME和REQUEST_FILENAME包含的值是相同的,即, Apache服务器的内部request_rec结构中的filename字段。 第一个其实就是大家都知道的CGI变量名,而第二个则是( 包含了request_rec结构中的uri字段的)REQUEST_URI的一个副本,<br>
特殊形式: %{ENV:variable} 其中的variable可以是任何环境变量。 它是通过查找Apache内部结构得到的, 或者(如果没找到的话)是由Apache服务器进程通过getenv()得到的。<br>
特殊形式: %{HTTP:header} 其中的header可以是任何HTTP MIME头的名称。 它是通过查找HTTP请求得到的。比如: %{HTTP:Proxy-Connection}就是HTTP头 ``Proxy-Connection:''的值.<br>
特殊形式 %{LA-U:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于URL的)子请求后决定。 在重写需要使用一个尚未有效的但是会在之后的API程序段中设置的变量的时候,就会使用这个方法。 比如,需要在服务器级配置(httpd.conf文件)中重写REMOTE_USER变量, 则,必须使用%{LA-U:REMOTE_USER},因为此变量是由认证程序段设置的, 而这个程序段是在mod_rewrite所在的URL转译程序段之后才执行的。 但是,因为mod_rewrite是通过API修正程序段来实现目录级(.htaccess file)配置的, 而这个程序段在认证程序段之前就执行了,所以用%{REMOTE_USER}就可以了。<br>
特殊形式: %{LA-F:variable} 它是一个预设的值, variable的最终值在执行一个内部的(基于文件名的)子请求后决定。 大多数情况下和上述的LA-U是相同的.<br>
CondPattern是条件pattern, 即, 一个应用于当前实例TestString的正则表达式, 即, TestString将会被计算然后与CondPattern匹配.<br>
<br>
谨记: CondPattern是一个兼容perl的正则表达式, 但是还有若干增补:<br>
<br>
可以在pattern串中使用'!' 字符(惊叹号)来实现匹配的反转。<br>
CondPatterns有若干特殊的变种。除了正则表达式的标准用法,还有下列用法:<br>
'<CondPattern' (词典顺序的小于)<br>
将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString小于CondPattern,则为真.<br>
'>CondPattern' (词典顺序的大于)<br>
将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString大于CondPattern,则为真.<br>
'=CondPattern' (词典顺序的等于)<br>
将CondPattern视为纯字符串,与TestString以词典顺序相比较. 如果按词典顺序,TestString等于CondPattern,则为真,即, 两个字符串(逐个字符地)完全相等。如果CondPattern只是""(两个引号), 则TestString将与空串相比较.<br>
'-d' (是一个目录[directory])<br>
将TestString视为一个路径名并测试它是否存在而且是一个目录.<br>
'-f' (是一个常规的文件[file])<br>
将TestString视为一个路径名并测试它是否存在而且是一个常规的文件.<br>
'-s' (是一个非空的常规文件[size])<br>
将TestString视为一个路径名并测试它是否存在而且是一个尺寸大于0的常规的文件.<br>
'-l' (是一个符号连接[link])<br>
将TestString视为一个路径名并测试它是否存在而且是一个符号连接.<br>
'-F' (对子请求有效的业已存在的文件)<br>
测试TestString是否一个有效的文件, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!<br>
'-U' (对子请求有效的业已存在的URL)<br>
测试TestString是否一个有效的URL, 而且可以被服务器当前已经配置的所有存取控制所存取。 它用一个内部子请求来做判断,由于会降低服务器的性能,请小心使用!<br>
注意<br>
所有这些测试都可以用惊叹号作前缀('!')以实现条件的反转.<br>
另外,还可以为CondPattern追加特殊的标记<br>
<br>
[flags]<br>
<br>
作为RewriteCond指令的第三个参数。 Flags是一个以逗号分隔的以下标记的列表:<br>
<br>
'nocase|NC' (no case)<br>
它使测试忽略大小写, 即, 扩展后的TestString和CondPattern中, 'A-Z' 和'a-z'是没有区别的。此标记仅作用于TestString和CondPattern的比较, 而对文件系统和子请求的测试不起作用。<br>
'ornext|OR' (or next condition)<br>
它以OR方式组合若干规则的条件,而不是隐含的AND。典型的例子如下:<br>
RewriteCond %{REMOTE_HOST} ^host1.* [OR]<br>
RewriteCond %{REMOTE_HOST} ^host2.* [OR]<br>
RewriteCond %{REMOTE_HOST} ^host3.*<br>
RewriteRule ...some special stuff for any of these hosts...<br>
<br>
如果不用这个标记,则必须使用三个 条件/规则。<br>
举例:<br>
<br>
如果要按请求头中的``User-Agent:'重写一个站点的主页,可以这样写:<br>
<br>
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*<br>
RewriteRule ^/$ /homepage.max.html [L]<br>
<br>
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*<br>
RewriteRule ^/$ /homepage.min.html [L]<br>
<br>
RewriteRule ^/$ /homepage.std.html [L]<br>
<br>
含义: 如果你使用的浏览器是Netscape Navigator(其识别标志是'Mozilla'), 则你将得到内容最大化的主页,包括Frames等等; 如果你使用的是(基于终端的)Lynx,则你得到的是内容最小化的主页,不包含tables等等; 如果你使用的是其他的浏览器,则你得到的是一个标准的主页。<br>
<br>
<br>
RewriteEngine 指令<br>
<br>
RewriteEngine指令打开或关闭运行时刻的重写引擎。 如果设置为off,则mod_rewrite模块不执行任何运行时刻的重写操作, 甚至也不更新SCRIPT_URx环境变量。<br>
<br>
使用该指令可以使mod_rewrite模块无效,而无须注释所有的RewriteRule指令!<br>
<br>
注意:默认情况下,重写配置是不可继承的, 即,必须在每个需要的虚拟主机中设置一个RewriteEngine on指令。<br>
<br>
<br>
RewriteLock 指令<br>
<br>
此指令设置mod_rewrite为了和RewriteMap 程序通讯而使用的一个同步加锁文件的名称。 在需要使用重写映射表程序时,它必须是一个本地路径(而不能是一个NFS挂接设备); 对其他类型的重写映射表,则无此要求。<br>
<br>
<br>
RewriteLog 指令<br>
<br>
RewriteLog指令设置用于记录所有重写操作的文件的名称。 如果此文件名不是以斜杠('/')开头,则它是相对于Server Root的。 此指令应该仅仅出现在服务器级配置中。<br>
<br>
如果要关闭对重写操作的记录,不推荐把Filename设置为/dev/null, 因为,虽然重写引擎不能输出记录了,但仍会内部地建立这个日志文件, 它会使服务器速度降低,而且对管理员毫无益处! 要关闭日志,可以删除或注解RewriteLog指令, 或者使用RewriteLogLevel 0!<br>
安全<br>
参见Apache Security Tips,其中讲述了, 为什么如果存放日志的目录对除了启动服务器以外的用户是可写的会带来安全隐患。<br>
举例<br>
RewriteLog "/usr/local/var/apache/logs/rewrite.log"<br>
<br>
<br>
RewriteLogLevel 指令<br>
<br>
RewriteLogLevel指令设置重写引擎日志的详细程度的级别。 默认级别0意味着不记录,而9或更大的值意味着记录所有的操作。<br>
<br>
要关闭重写引擎日志,可以简单地设此值为0,关闭所有的重写操作记录。<br>
<br>
使用较高的Level值会使Apache服务器速度急剧下降! 重写日志使用大于2的Level值只用于调试!<br>
举例<br>
RewriteLogLevel 3<br>
<br>
<br>
RewriteMap 指令<br>
<br>
RewriteMap定义一个映射表, 由映射函数用于查找关键词来插入/替换字段。此查找操作的源可以是多种类型。<br>
<br>
MapName是映射表的名称, 指定了一个映射函数,用于重写规则的字符串替换,它可以是下列形式之一:<br>
<br>
${ MapName : LookupKey }<br>
${ MapName : LookupKey | DefaultValue }<br>
<br>
如果使用了这样的形式,则会在MapName中查找关键词LookupKey。 如果找到了,则被替换成SubstValue; 如果没有找到,则被替换成DefaultValue, 如果没有指定DefaultValue,则被替换成空字符串。<br>
<br>
可以使用下列MapType和MapSource的组合:<br>
<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -