工作,学习,生活,这里将会有一些记录. 备用域名:http://meisw.wdlinux.cn 注册 | 登陆
浏览模式: 标准 | 列表全部文章

VI常用实用命令学习

#:   是指常用的命令

一般模式:光标移动
h 或 ->     光标向左移动一个字符
------------------------------------------------------------
l 或 <-     光标向右移动一个字符
------------------------------------------------------------
k 或 向上方向键    光标向上移动一个字符
------------------------------------------------------------
j 或 向下方向键    光标向下移动一个字符
------------------------------------------------------------
Ctrl+f         #  屏幕向前翻动一页
--------------------------------------------------------
Ctrl+b         #  屏幕向后翻动一页
--------------------------------------------------------
Ctrl+d     屏幕向前翻动半页
--------------------------------------------------------
Ctrl+u     屏幕向后翻动半页
--------------------------------------------------------
+     光标移动到非空格符的下一列
------------------------------------------------------------------
-     光标移动到非空格符的上一列
-------------------------------------------------------------------
n    按下数字键后再按空格键,光标会向右移动这一行的n个字符。
     (例如20,则光标会向右移动20个字符)
----------------------------------------------------------------------------------------------
0        #   (这是数字0)移动到这一行的第一个字符处
-----------------------------------------------------------------------------
$        #   移动到这一行的最后一个字符处
--------------------------------------------------------------------
H     光标移动到这个屏幕最上方的那一行
------------------------------------------------------------------------
M     光标移动到这个屏幕中央的那一行
----------------------------------------------------------------------
L     光标移动到这个屏幕最下方的那一行
------------------------------------------------------------------------
G        #   移动到这个文件的最后一行
----------------------------------------------------------------
nG     移动到这个文件的第n行。
     例如20G,则会移动到这个文件的第20行(可配合:set nu)
----------------------------------------------------------------------------------------------
n       #   光标向下移动n行
-------------------------------------------------------


一般模式:查找与替换

/word        #   在光标之后查找一个名为word的字符串
--------------------------------------------------------------------------
?word     在光标之前查找一个名为word的字符串
--------------------------------------------------------------------------
:n1,n2s/word1/word2/g      #   在第n1与n2行之间查找word1这个字符串,并将该字符串替换为word2
----------------------------------------------------------------------------------------------------
:1,$s/word1/word2/g      #   从第一行到最后一行查找word1字符串,并将该字符串替换为word2
--------------------------------------------------------------------------------------------------
:1,$s/word1/word2/gc      #   从第一行到最后一行查找word1字符串,并将该字符串替换为word2,
     且在替换前显示提示符让用户确认(confirm)
---------------------------------------------------------------------------------------------------


一般模式:删除、复制与粘贴

x,X        #   x为向后删除一个字符,X为向前删除一个字符
--------------------------------------------------------------------------------
nx     向后删除n个字符
-------------------------------------------------------
dd        #   删除光标所在的那一整行 
--------------------------------------------------------------
ndd        #   删除光标所在列的向下n列,例如,20dd则是删除20列
---------------------------------------------------------------------------------------
d1G     删除光标所在行到第一行的所有数据
------------------------------------------------------------------------
dG     删除光标所在行到最后一行的所有数据
--------------------------------------------------------------------------
yy        #   复制光标所在行
------------------------------------------------------
nyy        #   复制光标所在列的向下n列,例如,20yy则是复制20列
---------------------------------------------------------------------------------------
y1G     复制光标所在列到第一列的所有数据
------------------------------------------------------------------------
yG     复制光标所在列到最后一列的所有数据
--------------------------------------------------------------------------
p,P        #   p为复制的数据粘贴在光标下一行,P为粘贴在光标上一行
------------------------------------------------------------------------------------------
J     将光标所在列与下一列的数据结合成一行
-----------------------------------------------------------------------------
u        #   恢复前一个动作
------------------------------------------------------

 

编辑模式:

i,I        #   插入:在当前光标所在处插入输入的文字,已存在的字符会向后退
--------------------------------------------------------------------------------------------------
a,A        #   添加:由当前光标所在处的下一个字符开始输入,已存在的字符会向后退
-------------------------------------------------------------------------------------------------------
o,O        #   插入新的一行:从光标所在处的下一行行首开始输入字符
------------------------------------------------------------------------------------------
r,R        #   替换:r会替换光标所指的那一个字符;R会一直替换光标所指的文字,直到按下Esc为止
------------------------------------------------------------------------------------------------------
Esc        #   退出编辑模式,回到一般模式
------------------------------------------------------------------


命令行模式:

:w        #   将编辑的数据写入硬盘文件中
------------------------------------------------------------------
:w!     若文件属性为只读,强制写入该文件
------------------------------------------------------------------------
:q        #   退出vi
----------------------------------------------
q!     若曾修改过文件,又不想保存,使用!为强制退出不保存文件
---------------------------------------------------------------------------------------------
:wq        #   保存后退出,若为:wq!,则为强制保存后退出
---------------------------------------------------------------------------------
:w[filename]    将编辑数据保存为另一个文件(类似另存为新文档):x也是保存
------------------------------------------------------------------------------------
:r[filename]    在编辑的数据中,读入另一个文件的数据,亦即将filename这个文件内容加到光标所在行的后面
------------------------------------------------------------------------------------------------------
:set nu     显示行号,设定之后,会在每一行的前面显示该行的行号
------------------------------------------------------------------------------------------
:set nonu    与set nu相反,为取消行号
----------------------------------------------------------------
n1,n2w[filename]   将n1到n2的内容保存为filename这个文件
----------------------------------------------------------------------------

apache rewrite规则(RewriteCond,RewriteRule)

RewriteCond指令格式

语法: RewriteCond TestString CondPattern [flags]

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

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

1)$N:RewriteRule后向引用,其中(0 <= N <= 9) 。$N引用紧跟在RewriteCond后面的RewriteRule中模板中的括号中的模板在当前URL中匹配的数据。

2)%N:RewriteCond后向引用,其中(0 <= N <= 9) 。%N引用最后一个RewriteCond的模板中的括号中的模板在当前URL中匹配的数据。

3)${mapname:key|default}:RewriteMap扩展。

2、CondPattern是条件pattern, 即一个应用于当前实例TestString的正则表达式, 即TestString将会被计算然后与CondPattern匹配。作为一个标准的扩展正则式,CondPattern有以下补充:

1)可以在模板串前增加一个!前缀,以用表示不匹配模板。但并不是所有的test都可以加!前缀。

2)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完成的, 因此需要小心使用这个功能以降低服务器的性能。

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

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

2)’ornext|OR’ (建立与下一个条件的或的关系)   默认的情况下,二个条件之间是AND的关系,用这个标志将关系改为OR。例如: RewriteCond %{REMOTE_HOST} ^host1.* [OR] RewriteCond %{REMOTE_HOST} ^host2.* [OR] RewriteCond %{REMOTE_HOST} ^host3.* RewriteRule … 如果没有[OR]标志,需要写三个条件/规则.

RewriteRule 指令

语法: RewriteRule Pattern Substitution [flags]

1) Pattern是一个作用于当前URL的兼容perl的正则表达式. 这里的“当前”是指该规则生效时的URL的值。

2) Substitution是,当原始URL与Pattern相匹配时,用以替代(或替换)的字符串。

3) 此外,Substitution还可以追加特殊标记[flags] 作为RewriteRule指令的第三个参数。 Flags是一个包含以逗号分隔的下列标记的列表:

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

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

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

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\%3d$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的路径。

案例:

city_map.txt的内容:

hangzhou 12

beijing 13

1、hangzhou.google.com/tianqi/20090401 跳转到 www.google.com/service/detail.html?id=tianqi&date=20090401

RewriteMap city-map txt:/etc/httpd/conf.d/map/city_map.txt

RewriteCond %{HTTP_HOST}    ^(.+)\.google\.com$

RewriteRule ^/([\w]+)/([\d]+)$ /service/detail\.html\?id=$1&date=$2&c=${city-map:%1|%1} [PT,L]解释:

%{HTTP_HOST}:取请求的域名

^(.+)\.google\.com$:^,开头;$结尾。.(逗号),除终止符外的任意字符。+,重复一个或一个以上的字符。\,转义字符。

^/([\w]+)/([\d]+)$:[],集合字符。\w,数字或字母。\d,数字。

$1:表示的是符合RewriteRule 中[\w]+正则式的字符串,也就是tianqi。

$2:表示的是符合RewriteRule 中[\d]+ 正则式的字符串,也就是20090401。

%1:表示的是符合RewriteCond 中.+正则式的字符串,也就是hangzhou。

${city-map:%1|%1}:表示取city-map中%1也就是hangzhou对应的值,如果没有则为%1也就是hangzhou。

2、能看出下面的规则是做了什么吗?

RewriteCond     %{HTTP_HOST}    ^(.+)\.google\.com$

RewriteRule ^/([\w]+)/([^-]+)-([^-]+)--([^-]+)-([^-]+)--([^-]+)-([^-]+)--([^-]+-[^-]+--[^-]+-[^-]+--[^-]+-[^-]+)$   /$1/$2=$3&$4=$5&$6=$7&$8   [C]

RewriteCond     %{HTTP_HOST}    ^(.+)\.google\.com$

RewriteRule ^/([\w]+)/([^-]+)-([^-]+)--([^-]+)-([^-]+)--([^-]+)-([^-]+)$      /service/list\.html\?frontCategoryId=${category-map:$1|0}&$2=$3&$4=$5&$6=$7&city=${city-map:%1|%1}   [PT,L]解释:

这个规则是想把-(中划线)转为=,把- -(两条中划线)转为&。

[^-]:^在字符集合符号([])之内表示反向选择,之外表示行首,所以表示不以-开头。

因为$N,N最大为9,所以使用了C,用第二条RewriteRule把第一条RewriteRule中的最后一个节点,即$8,进行继续转换。

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

RewriteRule 规则

Apache Rewrite 规则详解(转)

Apache Rewrite 规则详解

在开篇之前:
我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的。需要原文的可以在谷歌上搜索一下”Apache Rewrite 规则详解”
好在我对正则表达式有所了解,把原文的代码都通过自己的理解改写了一下,并都能够达到题设的要求,并联想需求添加了例子。
本文是经过我实验后修改有效的,如果还是出现500错误请去掉 # 及后面的注释(也许有些环境不支持中文注解),如果还是错误请在下面给我留言。
1、Rewrite规则简介:
Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言。可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式。如果要想用到rewrite模块,必须先安装或加载rewrite模块。方法有两种一种是编译apache的时候就直接安装rewrite模块,别一种是编译apache时以DSO模式安装apache,然后再利用源码和apxs来安装rewrite模块。
基于服务器级的(httpd.conf)有两种方法,一种是在httpd.conf的全局下直接利用RewriteEngine on来打开rewrite功能;另一种是在局部里利用RewriteEngine on来打开rewrite功能,下面将会举例说明,需要注意的是,必须在每个virtualhost里用RewriteEngine on来打开rewrite功能。否则virtualhost里没有RewriteEngine on它里面的规则也不会生效。
基于目录级的(.htaccess),要注意一点那就是必须打开此目录的FollowSymLinks属性且在.htaccess里要声明RewriteEngine on。
2、举例说明:
例一.下面是在一个虚拟主机里定义的规则。功能是把client请求的主机前缀不是www.kiya.cn和70.40.213.183都跳转到主机前缀为http://www.kiya.cn,避免相同内容的网页有多个指向的域名,如http://kiya.cn
NameVirtualHost 70.40.213.183:80
ServerAdmin slj@kiya.cn
DocumentRoot “/web”
ServerName kiya.cn
RewriteEngine on #打开rewirte功能
RewriteCond %{HTTP_HOST} !^www.kiya.cn [NC] #声明Client请求的主机中前缀不是www.kiya.cn,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^70.40.213.183 [NC] #声明Client请求的主机中前缀不是70.40.213.183,其中 [NC] 的意思是忽略大小写
RewriteCond %{HTTP_HOST} !^$ #声明Client请求的主机中前缀不为空
RewriteRule ^(.*) http://www.kiya.cn/ [L] #含义是如果Client请求的主机中的前缀符合上述条件,则直接进行跳转到http://www.kiya.cn/,[L]意味着立即停止重写操作,并不再应用其他重写规则。这里的.*是指匹配所有URL中不包含换行字符,()括号的功能是把所有的字符做一个标记,以便于后面的应用.就是引用前面里的(.*)字符。
例二.将输入 en.sicasoft.com 的域名时跳转到www.sicasoft.com
RewriteEngine on
RewriteCond %{HTTP_HOST} ^en.sicasoft.com [NC]
RewriteRule ^(.*) http://www.sicasoft.com/ [L]
例三.赛卡软件近期更换了域名,新域名为www.sicasoft.com, 更加简短好记。这时需要将原来的域名ss.kiya.cn, 以及论坛所在地址ss.kiya.cn/bbs/定向到新的域名,以便用户可以找到,并且使原来的论坛 URL 继续有效而不出现 404 未找到,比如原来的http://ss.kiya.cn/bbs/tread-60.html, 让它在新的域名下继续有效,点击后转发到http://bbs.sicasoft.com/tread-60.html,而其他网页,如原先的http://ss.kiya.cn/purchase不会到二级域名bbs.sicasoft.com/purchase上,而是到www.sicasoft.com/purchase
按照这样的要求重定向规则应该这样写:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/bbs/
RewriteRule ^bbs/(.*) http://bbs.sicasoft.com/$1 [R=permanent,L]
RewriteCond %{REQUEST_URI} !^/bbs/
RewriteRule ^(.*) http://www.sicasoft.com/$1 [R=permanent,L]
3.Apache mod_rewrite规则重写的标志一览
1) R[=code](force redirect) 强制外部重定向
强制在替代字符串加上http://thishost[:thisport]/前缀重定向到外部的URL.如果code不指定,将用缺省的302 HTTP状态码。
2) F(force URL to be forbidden)禁用URL,返回403HTTP状态码。
3) G(force URL to be gone) 强制URL为GONE,返回410HTTP状态码。
4) P(force proxy) 强制使用代理转发。
5) L(last rule) 表明当前规则是最后一条规则,停止分析以后规则的重写。
6) N(next round) 重新从第一条规则开始运行重写过程。
7) C(chained with next rule) 与下一条规则关联
如果规则匹配则正常处理,该标志无效,如果不匹配,那么下面所有关联的规则都跳过。
8) T=MIME-type(force MIME type) 强制MIME类型
9) NS (used only if no internal sub-request) 只用于不是内部子请求
10) NC(no case) 不区分大小写
11) QSA(query string append) 追加请求字符串
12) NE(no URI escaping of output) 不在输出转义特殊字符
例如:RewriteRule /foo/(.*) /bar?arg=P1%3d$1 [R,NE] 将能正确的将/foo/zoo转换成/bar?arg=P1=zoo
13) PT(pass through to next handler) 传递给下一个处理
例如:
RewriteRule ^/abc(.*) /def$1 [PT] # 将会交给/def规则处理
Alias /def /ghi
14) S=num(skip next rule(s)) 跳过num条规则
15) E=VAR:VAL(set environment variable) 设置环境变量
4.Apache rewrite例子集合
URL重定向
例子一:
同时达到下面两个要求:
1.用http://www.zzz.com/xxx.php 来访问 http://www.zzz.com/xxx/
2.用http://yyy.zzz.com 来访问 http://www.zzz.com/user.php?username=yyy 的功能
RewriteEngine On
RewriteCond %{HTTP_HOST} ^www.zzz.com
RewriteCond %{REQUEST_URI} !^user.php$
RewriteCond %{REQUEST_URI} .php$
RewriteRule (.*).php$ http://www.zzz.com/$1/ [R]
RewriteCond %{HTTP_HOST} !^www.zzz.com
RewriteRule ^(.+) %{HTTP_HOST} [C]
RewriteRule ^([^.]+).zzz.com http://www.zzz.com/user.php?username=$1
例子二:
/type.php?typeid=* –> /type*.html
/type.php?typeid=*&page=* –> /type*page*.html
RewriteRule ^/type([0-9]+).html$ /type.php?typeid=$1 [PT]
RewriteRule ^/type([0-9]+)page([0-9]+).html$ /type.php?typeid=$1&page=$2 [PT]
5.使用Apache的URL Rewrite配置多用户虚拟服务器
要实现这个功能,首先要在DNS服务器上打开域名的泛域名解析(自己做或者找域名服务商做)。比如,我就把 *.kiya.us和 *.kiya.cn全部解析到了我的IP地址70.40.213.183上。
然后,看一下我的Apache中关于*.kiya.us的虚拟主机的设定。
ServerAdmin webmaster@kiya.us
DocumentRoot /home/www/www.kiya.us
ServerName dns.kiya.us
ServerAlias dns.kiya.us kiya.us *.kiya.us
CustomLog /var/log/httpd/osa/access_log.log” common
ErrorLog /var/log/httpd/osa/error_log.log”
AllowOverride None
Order deny,allow
#AddDefaultCharset GB2312
RewriteEngine on
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$
RewriteRule ^(.+) %{HTTP_HOST}$1 [C]
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/www.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
在这段设定中,我把*.kiya.cn和*.kiya.us 的Document Root都设定到了 /home/www/www.kiya.us
继续看下去,在这里我就配置了URL Rewrite规则。
RewriteEngine on #打开URL Rewrite功能
RewriteCond %{HTTP_HOST} ^[^.]+.kiya.(cn|us)$ #匹配条件,如果用户输入的URL中主机名是类似 xxxx.kiya.us 或者 xxxx.kiya.cn 就执行下面一句
RewriteRule ^(.+) %{HTTP_HOST}$1 [C] #把用户输入完整的地址(GET方式的参数除外)作为参数传给下一个规则,[C]是Chain串联下一个规则的意思
RewriteRule ^([^.]+).kiya.(cn|us)(.*)$ /home/www/dev.kiya.us/sylvan$3?un=$1&%{QUERY_STRING} [L]
# 最关键的是这一句,使用证则表达式解析用户输入的URL地址,把主机名中的用户名信息作为名为un的参数传给/home/www/dev.kiya.us目录下的脚本,并在后面跟上用户输入的GET方式的传入参数。并指明这是最后一条规则([L]规则)。注意,在这一句中指明的重写后的地址用的是服务器上的绝对路径,这是内部跳转。如果使用http://xxxx这样的URL格式,则被称为外部跳转。使用外部跳转的话,浏览着的浏览器中的URL地址会改变成新的地址,而使用内部跳转则浏览器中的地址不发生改变,看上去更像实际的二级域名虚拟服务器。
设置后重启Apache服务器就大功告成了!
 
今天上网看到了有人提一个问题:
求Rewrite 防盗链正则
不允许www.im286.com www.chinaz.com 这两个网站盗链 , 其它的网站都可以盗链的规则怎么写.
论坛中的答案是:
RewriteEngine On
RewriteCond %{HTTP_REFERER} chinaz.com [NC]
RewriteCond %{HTTP_REFERER} im286.com [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|rar|zip|txt|ace|torrent|gz|swf)$ http://www.xxx.com/fuck.png [R,NC,L]
 
介绍一篇文章:http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_rewrite.html
 
一、关于是否需要使用完全转义,比如在 RewriteCond %{HTTP_REFERER} chinaz.com [NC] 中 把 chinaz.com 改成 chinaz\.com
答案是,两者都是可以的。
二、今天在做 YOURcaddy.com (就是我去年做的PlanetCoachella的变形)的时候,在 GoDaddy 主机上无法正常转向,后来找到了问题:
在HostMonster以及我自己的机器上,是用
RewriteRule ^business/([^\.]+)$ biz/detail.php?name=$1 [L]
达到改写的。而在Godaddy主机上,是这样:
RewriteRule ^business/([^\.]+)$ /biz/detail.php?name=$1 [L]
目标文件前多了一个/
现在想想,可能是因为没有指定RewriteBase,至于到底是不是我改日再验证一下。
三、添加两个关于判断 USER AGENT 例子和自动添加.php扩展名及自动换.html到.php扩展名的例子:
1
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* – [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。
2
RewriteEngine On
RewriteBase /test
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ([^/]+)$ /test/$1.php
#for example: /test/admin => /test/admin.php
RewriteRule ([^/]+)\.html$ /test/$1.php [L]
#for example: /test/admin.html => /test/admin.php
限制目录只能显示图片
< IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !^.*\.(gif|jpg|jpeg|png|swf)$
RewriteRule .*$ – [F,L]
< /IfModule>
 
补充,关于特定文件扩展名的重写。
重写有某些扩展名的文件:
RewriteRule (.*.css$|.*.js$) gzip.php?$1 [L]
如果要排除一些扩展名:
RewriteRule !\.(js|ico|gif|jpg|JPG|png|PNG|css|pdf|swf)$ index.php

ngrep

find 手册

find相关命令和参数的相关说明

 find - 在目录层次中寻找文件
参数说明:
-daystart 
                从今天也不从24小时之前开始计量时间(对 -amin,
                 -atime, -cmin, -ctime, -mmin, 和-mtime有效)。

        -depth
                先搜索目录的内容再搜索目录本身。

        -follow
                不检索符号链接。意即 -noleaf。

               


        -help, --help
                列出find的命令行用法的概要,然后返回

        -maxdepth levels
                在命令行下目录的最大深度级别(非负整数),'-maxdepth 0'
                意味着只在命令行参数中应用检测和事件。

        -mindepth levels
                小于指定数字(非负整数)的深度级别的目录层次将不应用检
                测和事件。'-mindepth 1'意味着除了当前的命令行参数外
                将搜索所有的文件。
       
        -mount
                在其它文件系统中不进入目录。

        -noleaf
                不优化假如某一个目录里包含少于两个以下的子目录。这个选
                项在那些不遵循UNIX文件系统链界约定的文件系统中用,像
                CD-ROM,MS-DOS或AFS卷加载点上。在UNIX文件系统中,每个
                目录有至少两个硬链接,它的名字和'.'。它的子目录(假如有)
                各自有一个'..'链接到它本身。在FIND检索一个目录时,在统
                计其子目录少于两个,意味着将不需要在进行下去了。只需要
                检索一下这个目录名;这在检索速度上是个有意义的提高。

        -version, --version
                显示FIND的版本号,终止程序。

        -xdev 在其它文件系统中不进入目录。
说明:
        用下边的格式可以指定数字参数

        +n      比n大。
        -n      比n小。
        n       恰好是n。



        -amin n
                文件最后一次访问是在n分钟前。

        -anewer file
                文件最后访问时间比指定的file修改时间更晚。 -anewer会
                受到-follow的影响当在命令行中-follow在-anewer之前时。

        -atime n
                文件最后一次访问是n*24小时前。

        -cmin n
                文件的状态的改变是在n分钟前。

        -cnewer file
                文件状态的改变比指定的file状态的改变时间更晚。-cnewer
                会受到-follow的影响当命令行中-follow在-cnewer之前时。

        -ctime n
                文件状态的改变时间是在n*24小时前。

        -empty 文件是空的,它是一个正规的文件或目录。

        -false  总是假。

        -fstype type
                文件是type类型。在不同的unix系统中有多种不同的文件系
                统类型。在一些不同版本的unix中有效的文件类型有:ufs,
                 4.2, 4.3, nfs, tmp, mfs, S51k, S52k.你可以用
                -printf加上%F指示来看你的文件系统的类型。

        -gid n 文件的数字型组ID是n.

        -group gname
                文件属于组gname(允许数字型的gname).

        -ilname pattern
                 同-lname, 但是匹配是大小些不区分的.

        -iname pattern
                同-name,但是匹配是大小些不区分的。举个例子,这个通配符
                'fo*'和'f??'匹配文件名'Foo', 'FOO', 'foo', 'fOo',等
                等。

        -inum n
                文件的i结点数是n.
     


        -ipath pattern
                同 -path, 但是匹配大小写不区分。

        -iregex pattern
                同 -regex, 但是匹配大小写不区分.

        -links n
                文件有n个链结。

        -lname pattern
                文件是个符号链结内容匹配shell通配符pattern。元字符
                '/'或'.'不能区别对待。

        -mmin n
                文件的数据最后一次被编辑是在n分钟前.

        -mtime n
                文件的数据最后一次被编辑是在n*24小时前.

        -name pattern
                基本的文件名(起始的目录已经检测过了)匹配shell通配符
                pattern.元字符('*', '?', 和'[]')不能匹配一个以'.'
                开头的文件名。忽略在它下边的目录或文件,用-prune;参看
                -path描述中的例子。

        -newer file
                文件最后编辑时间比指定的file晚
                -newer会受到-follow的影响当在命令行中-follow在-newer
                之前时。

        -nouser
                没有用户符合文件的数字型用户ID.

        -nogroup
                没有组符合文件的数字型组ID.

        -path pattern
                文件名匹配shell通配符pattern.元字符不能区分'/'和'.';
                因此,像例子

                        find . -path './sr*sc'

                将列出一个目录条目'./src/misc'(假如它存在的话).
                忽略整个目录树,用-prune比检测树中的每一个文件要好一
                些。举个例子,跳过'src/emacs'和它下边的所有文件,列出
                其它发现的文件,执行下边的命令:

                        find . -path './src/emacs' -prune -o -print



                             



        -perm mode
                文件的访问权限位恰好是mode(八进制或符号).符号模式用
                模式0做为开始。

        -perm -mode
                文件的所有访问权限位mode都设了。

        -perm +mode
                文件的一些访问权限位mode设了。

        -regex pattern
                文件匹配规则的表达式通配符。这是一个在整个路径中的
                匹配,而不是一个检索。举个例子,匹配一个'./fubar3'
                文件名的文件,你应该用规则的表达式'.*bar.'或'.*b.*3',
                 而不是'b.*r3'.

        -size n[bckw]
                文件占用n个单元空间。在缺省时或n后边跟着字符b时,这个
                单元是512字节的块,n后边跟着c是字节,n后边跟着k是千字节,
                n后边跟着w是两个字节的词.文件大小不能计算间接的块,但是
                能计算很少的没能实际分配大小的文件。

        -true 总是真

        -type c
                文件是类型c:
                b       块(缓冲)设备.
                c       字符设备.
                d       目录.
                p       有名管道(FIFO).
                f       规则文件.
                l       符号链结.
                s       插座.

        -uid n 文件的数字型用户ID是n.

        -used n
                文件的最后访问时间是在它的状态改变时间的n天前.






                               



        -user uname
                文件是属于名为uname(数字型ID也可)的用户。
        -xtype c
                这一项是和-type相同的除非文件是一个符号链结。
                若是符号链结:假如 -follow 没有给出,若这个文件链结
                的是类型为c的文件,则返回真;假如给了-follow选项,若c
                为'l',则返回真.对于符号链结, -xtype检测链结的文件类
                型,-type不做这样的检测。



事件


        -exec command ;
                执行命令;返回的状态值为零则为真。所有在这之后的参数
                都是command的参数,直到遇到';'.字符串'{}'将被当前的
                文件名代替,作为当前命令的参数,并不是象一些版本FIND
                一样是个单独存在的一个参数,这些语句应该被转义(用'\')
                或被引用,以此来保护他们被SHELL展开。这个命令将在起始
                目录被执行。

        -fls file
                值为真;同 -ls 但像 -fprint一样将输出写向文件file

        -fprint file
                值为真;输出整个文件名到文件file中.当find运行时file不
                存在,它将被建立;若存在,原来的文件内容将被删掉。也可以
                用名为"/dev/stdout"和"/dev/stderr"的文件,它们分别指
                的时是标准输出和标准错误。

        -fprint0 file
                值为真;同 -printf 但是将像 -fprint 一样将输出写像文
                件file.

        -ok command
                同 -exec但是先问用户(在标准输入);假如应答不是以'y'或
                'Y'开头,将不执行command,返回假。

        -print  值为真;在标准输出上输出整个文件名,并加一个新行。

        -print0
                值为真;在标准输出上输出整个文件名,并加一个空字符。这
                将允许



                                        6


                其它程序能正确的处理在FIND输出中包含新行的文件名。

        -printf format

                值为真。通过解释转义字符'\'和指示字符'%',格式化输出
                到标准输出上.空间宽度和精度能像c函数'printf'一样被
                指定。不像 -print, -printf不能在字符串的末尾自动加
                一个新行。这些转义和指示字符是:

                \a      鸣声.

                \b      退格键.

                \c      马上停止格式输出,输出到标准输出上。

                \f      换页符.

                \n      行符.

                \r      回车符.

                \t      水平制表符.

                \v      竖直制表符.

                \      反斜线.

                一个'\'字符后跟着其它字符将被视为普通字符,它们都将
                被输出。

                %%      符号'%'.

                %a      在格式输出中通过调用c函数'ctime'返回文件的
                        最后访问时间。

                %AK     用K指定的格式输出文件的最后访问时间。K可以
                        是'@'或者C函数'strftime'函数的一个指示。有
                        效的K值列在下边;它们不一定在所有的系统中都
                        有效,主要取决于这些系统中'strftime'函数的
                        异同。

                        @       从Jan.   1,  1970,  00:00 GMT到
                                现在的秒数。

                        时间域:

                        H       点钟 (00..23).




                        I       点钟 (01..12).

                        k       点种 ( 0..23).

                        l       点钟 ( 1..12).

                        M       分钟 ( 00.59).

                        p       本地的上午或下午.

                        r       时间,12小时格式 (hh:mm:ss[AP]M).

                        S       秒钟 (00.61).

                        T       时间,24小时格式 (hh:mm:ss).

                        X       本地的时间表示 (H:M:S).

                        Z       时区 (举例来说,EDT(美国东部时区)),或没
                                有表示没有可决定的时区。

                        日期域:

                        a       本地缩写的星期名 (Sun..Sat).

                        A       本地完全的星期名,不定长 (Sunday..Saturday).

                        b       本地缩写的月份名 (Jan...Dec).

                        B       本地完全的月份名,不定长 (January...December).

                        c       本地的日期和时间 (Sat Nov 04 12:02:33 EST 1989).

                        d       当月的哪一天 (01..31).

                        D       日期 (mm/dd/yy).

                        h       同 b.

                        j       当年的哪一天 (001..366).

                        m       月份 (01..12).

                        U       当年的星期数,用星期日做为一星期的第一天 (00..53).

                        w       星期的哪一天

                        W       当年的星期数,用星期一做为一星期的第一天 (00..53).



                        x       本地的日期表示法 (mm/dd/yy).

                        y       当年的最后两位数 (00..99).

                        Y       年份 (1970...).

                %b      用512字节的块计算的文件的大小(上舍入)。

                %c      用C函数'ctime'返回的文件状态的最后改变时间。

                %Ck     被k指定的文件状态的最后改变时间,k与%A后的k相同.

                %d      文件在目录树中的深度;0意味着文件在命令行参数中.

                %f      不带目录的文件名(只有最后的元素).

                %F      这个文件所在的文件系统类型名;这个值能被 -fstype用。

                %g      文件的组名,若组无名则是组ID.

                %G      文件的数字组ID.

                %h      文件的主目录 (除了最后的元素).

                %H      命令行参数若文件在命令行参数中找到.

                %i      文件的i节点数 (10进制格式).

                %k      用1K字节的块计算文件的大小(上舍入)。

                %l      符号链接的目标(假如文件不是一个符号链接则返回一个
                        空字符串).

                %m      文件的访问权限位 (八进制)

                %n      文件的硬链接数

                %p      文件名.

                %P      用在命令行参数之下发现的文件名代替文件名.



                %s      用字节计算的文件大小.

                %t      用C函数'ctime'返回的文件的最后编辑时间。

                %Tk     被k指定格式的文件的最后编辑时间,k与%A后的k相同.

                %u      文件的用户名,若没有则输出用户数字ID.   

                %U      文件的数字ID.   

                字符'%'后跟着另外的字符将被丢弃(但是其它的字符将输出).

        -prune  假如 -depth 没指定,值为真;不进入当前的目录。
                若 -depth 给定,值为假;没作用.

        -ls     值为真;用 'ls -dils'格式在标准输出中列出当前目录的文件。
                块记数单位是1k字节,除非 设定了POSIXLY_CORRECT环境变量,
                将用512字节作为单位。



操作符


        列出优先级顺序
       
        ( expr )
                强制优先.

        ! expr  假如expr为假则为真.

        -not expr
                同 ! expr.

        expr1 expr2
                和操作(默认); 假如expr1值是假expr2不能鉴定。

        expr1 -a expr2
                同 expr1 expr2.

        expr1 -o expr2
                与操作;假如expr1值是真expr2不能鉴定。

        expr1 -or expr2
                同 expr1 -o expr2

ip_conntrack: table full, dropping packet

日志信息:
www kernel: printk: 135 messages suppressed.
Apr 17 16:37:26 www kernel: ip_conntrack: table full, dropping packet.
Apr 17 16:37:26 www kernel: ip_conntrack: table full, dropping packet
Apr 17 16:37:33 www kernel: printk: 139 messages suppressed.
Apr 17 16:37:33 www kernel: ip_conntrack: table full, dropping packet.
Apr 17 16:37:37 www kernel: printk: 60 messages suppressed.
Apr 17 16:37:37 www kernel: ip_conntrack: table full, dropping packet
Apr 17 16:37:52 www kernel: printk: 19 messages suppressed.
Apr 17 16:37:52 www kernel: ip_conntrack: table full, dropping packet.
有丢包现象,应该是系统内核屏蔽了网卡功能,此时系统对外表现为连接时通时断,接着执行如下操作:
[root@web ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
65536

针对这个问题,可调整以下参数:
echo 180 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
echo 6553600 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
echo 120 > /proc/sys/net/ipv4/neigh/default/gc_stale_time
echo 10240 > /proc/sys/net/ipv4/neigh/default/gc_thresh1
echo 40960 > /proc/sys/net/ipv4/neigh/default/gc_thresh2
echo 81920 > /proc/sys/net/ipv4/neigh/default/gc_thresh3

或vi /etc/sysctl.conf

net.ipv4.ip_conntrack_max=6553600
net.ipv4.netfilter.ip_conntrack_max=6553600
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120
net.ipv4.neigh.default.gc_thresh1=10240
net.ipv4.neigh.default.gc_thresh2=40960
net.ipv4.neigh.default.gc_thresh3=81920


net.core.rmem_default = 2097152
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.wmem_default = 2097152


再sysctl -p

相关参数说明:

ARP支持一个sysctl接口,可以用以配置全局参数或逐个网络接口地进行配制。该sysctl可以通过/proc/sys/net/ipv4/neigh/*/*文件或者使用sysctl(2)接口来访问。系统中每个接口都在/proc/sys/net/ipv4/neigh/.中有自己的目录。`default'目录中的设置用于所有新建的设备。sysctl相关的时间是以秒为单位,除非特别声明过.


anycast_delay

对IPv6相邻请求信息的回复的最大延迟时间;目前还不支持anycast。缺省值为1秒。

app_solicit

这是在使用多路广播探测(multicast probe)前,经过网络连接送到用户间隙ARP端口监控程序的探测(probe)最大数目(见mcast_solicit)。缺省值为0。

base_reachable_time

一旦发现相邻记录,至少在一段介于base_reachable_time/2和3*base_reachable_time/2之间的随机时间内,该记录是有效的。如果收到上层协议的肯定反馈,那么记录的有效期将延长。缺省值是30秒。

delay_first_probe_time

发现某个相邻层记录无效(stale)后,发出第一个探测要等待的时间。缺省值是5秒。

gc_interval

收集相邻层记录的无用记录的垃圾收集程序的运行周期,缺省为30秒。

gc_stale_time
决定检查一次相邻层记录的有效性的周期。当相邻层记录失效时,将在给它发送数据前,再解析一次。缺省值是60秒。

gc_thresh1

存在于ARP高速缓存中的最少层数,如果少于这个数,垃圾收集器将不会运行。缺省值是128。

gc_thresh2

保存在ARP高速缓存中的最多的记录软限制。垃圾收集器在开始收集前,允许记录数超过这个数字5秒。缺省值是512。

gc_thresh3

保存在ARP高速缓存中的最多记录的硬限制,一旦高速缓存中的数目高于此,垃圾收集器将马上运行。缺省值是1024。

locktime

ARP记录保存在高速缓存内的最短时间(jiffy数),以防止存在多个可能的映射(potential mapping)时,ARP高速缓存系统的颠簸(经常是由于网络的错误配置而引起)。缺省值是1秒。

mcast_solicit

在把记录标记为不可抵达的之前,用多路广播/广播(multicast/broadcast)方式解析地址的最大次数。

缺省值是3。

 

proxy_delay

当接收到有一个请求已知的代理ARP地址的ARP请求时,在回应前可以延迟的jiffy(时间单位,见BUG)数目。这样,以防止网络风暴。缺省值是0.8秒。

proxy_qlen

能放入代理ARP地址队列(proxy-ARP addresses)的数据包最大数目。缺省值是64。
重发一个请求前的等待jiffy(时间单位,见BUG)的数目。缺省值是1秒。
询问ARP端口监控程序前,试图发送单探测(unicast probe)的次数。(见app_solicit).缺省值是3秒。
每个没有被其它网络层解析的地址,在队列中可存放包的最大数目。缺省值是3.

rpm scripts

rpm --scripts -qp xxxxpackage