欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

htaccess R NC L 等特殊字符的作用 有大用

shiping1 的头像

 

 

apache的Rewrite介绍和一些实例讲解
2013-07-24 10:37:54   来源:   评论:0 点击:

 


说明一下其中的R、NC 和 L


R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响

1. 'redirect|R [=code]' (强制重定向)
  给当前的URI增加前缀

 


2. 'forbidden|F' (强制禁止访问URL所指的资源)
  立即返回状态值403 (FORBIDDEN)的应答包。将这个标志与合适的RewriteConds 联合使用,可以阻断访问某些URL。


3. 'gone|G' (强制返回URL所指资源为不存在(gone))
  立即返回状态值410 (GONE)的应答包。用这个标志来标记URL所指的资源永久消失了.


4. # 'proxy|P' (强制将当前URL送往代理模块(proxy module))
  这个标志,强制将substitution当作一个发向代理模块的请求,并立即将共送往代理模块。因此,必须确保substitution串是一个合法的URI (如, 典型的情况是以


5. 'last|L' (最后一条规则)
  中止重写流程,不再对当前URL施加更多的重写规则。这相当于perl的last命令或C的break命令。

 
6. 'next|N' (下一轮)
  重新从第一条重写规则开始执行重写过程,新开的过程中的URL不应当与最初的URL相同。 这相当于Perl的next命令或C的continue命令. 千万小心不要产生死循环。


7. # 'chain|C' (将当前的规则与其后续规则綑绑(chained))
  当规则匹配时,处理过程与没有綑绑一样;如果规则不匹配,则綑绑在一起的后续规则也不在检查和执行。


8. 'type|T=MIME-type' (强制MIME类型)
  强制将目标文件的MIME-type为某MIME类型。例如,这可用来模仿mod_alias模块对某目录的ScriptAlias指定,通过强制将该目录下的所有文件的类型改为 “application/x-httpd-cgi”.

 
9. 'nosubreq|NS' (used only if no internal sub-request )
   这个标志强制重写引擎跳过为内部sub-request的重写规则.例如,当mod_include试图找到某一目录下的默认文件时 (index.xxx),sub-requests 会在Apache内部发生. Sub-requests并非总是有用的,在某些情况下如果整个规则集施加到它上面,会产生错误。利用这个标志可排除执行一些规则。


10. 'nocase|NC' (模板不区分大小写)

这个标志会使得模板匹配当前URL时忽略大小写的差别。

 


11. 'qsappend|QSA' (追加请求串(query string))
  这个标志,强制重写引擎为Substitution的请求串追加一部分串,则不是替换掉原来的。借助这个标志,可以使用一个重写规则给请求串增加更多的数据。


12. 'noescape|NE' (不对输出结果中的特殊字符进行转义处理)
   通常情况下,mod_write的输出结果中,特殊字符(如'%', '$', ';', 等)会转义为它们的16进制形式(如分别为'%25', '%24', and '%3B')。这个标志会禁止mod_rewrite对输出结果进行此类操作。 这个标志只能在 Apache 1.3.20及以后的版本中使用。


13. 'passthrough|PT' (通过下一个处理器)
   这个标志强制重写引擎用filename字段的值来替换内部request_rec数据结构中uri字段的值。. 使用这个标志,可以使后续的其它URI-to-filename转换器的Alias、ScriptAlias、Redirect等指令,也能正常处理 RewriteRule指令的输出结果。用一个小例子来说明它的语义:如果要用mod_rewrite的重写引擎将/abc转换为/def,然后用 mod_alas将/def重写为ghi,则要:
RewriteRule ^/abc(.*) /def$1 [PT]
Alias /def /ghi
如 果PT标志被忽略,则mod_rewrite也能很好完成工作,如果., 将 uri=/abc/... 转换为filename=/def/... ,完全符合一个URI-to-filename转换器的动作。接下来 mod_alias 试图做 URI-to-filename 转换时就会出问题。
注意:如果要混合都含有URL-to-filename转换器的不同的模块的指令,必须用这个标志。最典型的例子是mod_alias和mod_rewrite的使用。


14. 'skip|S=num' (跳过后面的num个规则)
  当前规则匹配时,强制重写引擎跳过后续的num个规则。用这个可以来模仿if-then-else结构:then子句的最后一条rule的标志是skip=N,而N是else子句的规则条数。


15. 'env|E=VAR:VAL' (设置环境变量)
   设置名为VAR的环境变量的值为VAL,其中VAL中可以含有正则式的后向引用($N或%N)。这个标志可以使用多次,以设置多个环境变量。这儿设置的 变量,可以在多种情况下被引用,如在XSSI或CGI中。另外,也可以在RewriteCond模板中以%{ENV:VAR}的形式被引用。


16. 

   注意:一定不要忘记,在服务器范围内的配置文件中,模板(pattern)用以匹配整个URL;而在目录范围内的配置文件中,目录前缀总是被自动去掉后再 进行模板匹配的,且在替换完成后自动再加上这个前缀。这个功能对很多种类的重写是非常重要的,因为如果没有去前缀,则要进行父目录的匹配,而父目录的信息 并不是总能得到的。一个例外是,当substitution中有http://打头时,则不再自动增加前缀了,如果P标志出现,则会强制转向代理。

注 意:如果要在某个目录范围内启动重写引擎,则需要在相应的目录配置文件中设置“RewriteEngine on”,且目录的“Options FollowSymLinks”必须设置。如果管理员由于安全原因没有打开FollowSymLinks,则不能使用重写引擎。

http://hostname 开头),否则会从代理模块得到一个错误. 这个标志,是ProxyPass指令的一个更强劲的实现,将远程请求(remote stuff)映射到本地服务器的名字空间(namespace)中来。
   注意,使用这个功能必须确保代理模块已经编译到Apache 服务器程序中了. 可以用“httpd -l ”命令,来检查输出中是否含有mod_proxy.c来确认一下。如果没有,而又需要使用这个功能,则需要重新编译``httpd''程序并使用 mod_proxy有效。 http://thishost[:thisport]/ , 从而生成一个新的URL,强制生成一个外部重定向(external redirection,指生的URL发送到客户端,由客户端再次以新的URL发出请求,虽然新URL仍指向当前的服务器). 如果没有指定的code值,则HTTP应答以状态值302 (MOVED TEMPORARILY),如果想使用300-400(不含400)间的其它值可以通过在code的位置以相应的数字指定,也可以用标志名指定: temp (默认值), permanent, seeother.

注意,当使用这个标志时,要确实substitution是个合法的URL,这个标志只是在URL前增加http://thishost[:thisport]/ 前缀而已,重写操作会继续进行。如果要立即将新URL重定向,用L标志来中重写流程。 http://thishost[:port ]的前缀,则mod_rewrite会自动将此前缀去掉。因此,利用 http://thisthost 做一个无条件的重定向到自己,将难以奏效。要实现这种效果,必须使用R标志。
  Flags是可选参数,当有多个标志同时出现时,彼此间以逗号分隔。

==================================================
apache url rewrite 的RewriteRule参数详解

我们经常会在apache那边对一些url进行一些重写操作,那么就会涉及到很多的重写策略的选择,比如重定向的方式,参数的处理,规则匹配的顺序等。

比如我们某个应用会有下面的url rewrite规则:下面是对于域名imall.test.com访问的时候需要重定向到http://page.test.com/channel/imall/index.html这个url上,

	<VirtualHost *>
		ServerName imall.test.com#if("${industry_port}"!="80"):${industry_port}#end

		RewriteEngine on
		RewriteCond %{HTTP_HOST} =imall.test.com [NC]
		RewriteRule ^/$ http://page.test.com/channel/imall/index.html [L,R]
	</VirtualHost>
	
之前是想上面这么写的,但是发现浏览器的url变了,也就是R其实是外部重定向,那么我希望浏览器的url不改变,那么就需要内部重定向或者反向代理的设计。此时只能参考官方文档了:http://httpd.apache.org/docs/2.2/rewrite/flags.html

这里列出很多的参数:在每条规则后面可以加上多个参数,每个参数用逗号分隔

	RewriteRule pattern target [Flag1,Flag2,Flag3]
	
B (escape backreferences):非字母字符会被编码,
比如有个url为search.phpterm=x & y/z,那么此时不设置B参数时会被编码成search.phpterm=x%20&y%2Fz=,也是不对的,那么设置B参数之后会被编码成/search.phpterm=x%20%26%20y%2Fz,这样对于url rewrite的规则才能被正确解析转发。

C|chain  如果匹配,会继续匹配下一条规则,如果不匹配则跳过后面所有规则;

CO|cookie 可以给当前url设置cookie,规则如:[CO=NAME:VALUE:DOMAIN:lifetime:path:secure:httponly]
示例:

	RewriteEngine On
	RewriteRule ^/index\.html - [CO=frontdoor:yes:.example.com:1440:/]
	
DPI|discardpathinfo 丢弃PATH_INFO 信息

E|env 设置环境变量 [E=VAR:VAL] [E=!VAR]
示例:

	RewriteRule \.(png|gif|jpg) - [E=image:1]
	CustomLog logs/access_log combined env=!image
	
F|forbidden 直接返回403状态码

	RewriteRule \.exe - [F]
	
G|gone 返回410 状态码,表示资源不再可用

	RewriteRule oldproduct - [G,NC]
	
H|handler 指定请求被某个handler处理,下面这个url表示被php处理引擎处理

	RewriteRule !\. - [H=application/x-httpd-php]
	
L|last 匹配了就不再匹配后面的规则

	RewriteBase /
	RewriteCond %{REQUEST_URI} !=/index.php
	RewriteRule ^(.*) /index.phpreq=$1 [L,PT]
	
N|next 重新从第一条规则开始匹配

	RewriteRule (.*)A(.*) $1B$2 [N]
	
NC|nocase 大小写不敏感
	
	RewriteRule (.*\.(jpg|gif|png))$ http://images.example.com$1 [P,NC]
	
NE|noescape 不转码特殊字符,默认是会把&,?等特殊字符转成16进制编码,

	RewriteRule ^/anchor/(.+) /bigpage.html#$1 [NE,R]

NS|nosubreq 规则不作用于子请求上, SSI (Server Side Include) 

P|proxy 做为反向代理转发请求,这样浏览器url就不会改变

	RewriteRule /(.*)\.(jpg|gif|png) http://images.example.com/$1.$2 [P]
	
PT|passthrough url作为一个文件路径处理

	Alias /icons /usr/local/apache/icons
	RewriteRule /pics/(.+)\.jpg /icons/$1.gif [PT]
	
QSA|qsappend 带上query参数

	RewriteRule /pages/(.+) /page.phppage=$1 [QSA]
	
R|redirect 重定向 默认302 重定向

S|skip 跳过不想执行的规则匹配

	# Is the request for a non-existent file
	RewriteCond %{REQUEST_FILENAME} !-f
	RewriteCond %{REQUEST_FILENAME} !-d
	# If so, skip these two RewriteRules
	RewriteRule .- [S=2]
	RewriteRule (.*\.gif) images.php$1
	RewriteRule (.*\.html) docs.php$1
	
T|type 指定MIME type 类型

	# Serve .pl files as plain text
	RewriteRule \.pl$ - [T=text/plain]

	# Files with 'IMG' in the name are jpg images.
	RewriteRule IMG - [T=image/jpg]

==================================================

例子:
RewriteEngine on
RewriteCond %{HTTP_USER_AGENT} ^MSIE [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Opera [NC]
RewriteRule ^.* - [F,L] 这里”-”表示没有替换,浏览器为IE和Opera的访客将被禁止访问。

例子:
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>

 
    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据。http post请求的url格式为:
http://demo-domain/myuri?param1=p1&param2=p2。由于myuri非php文件,故要借助Apache的rewrite功能将其“引流”至php脚本,由后者实现真正的代理功能。
        Apache的Rewrite功能由扩展模块mod_rewrite.so实现,关于mode_rewrite的介绍,可以参考Apache官方文档。
        不得不说,对于不熟悉Apache的新手(比如我)来说,还是需要折腾一番的。好在最后终于搞定了,作为笔记,记录于此。
        大体来说,要使Apache实现正常的rewrite功能并实现HTTP POST请求的代理功能,需要以下2个步骤。
1. 启用Apache的mod_rewrite扩展
         默认情况下,Apache的扩展模块中是包含mod_rewrite.so的,相应地,其conf/httpd.conf中也会有下面这行内容:
         #LoadModule rewrite_module modules/mod_rewrite.so
         mod_rewrite扩展默认未启用,我们只需将#注释符去掉,启用该扩展模块即可。
2. 开启RewriteEngine并配置RewriteRule
         在httpd.conf文件最后部分添加下面2行内容:
           RewriteEngine ON
           RewriteRule ^/myuri.*$ /myproxy.php
         这样就将url的方法名为myuri的http请求rewrite至myproxy.php脚本,由后者实现http proxy功能。
         需要注意的几点:
         1)由于我的业务需求是在服务器级做rewrite,故只需修改httpd.conf相关配置项,无需修改<Directory /> section中的AllowOverride配置,如果要用.htaccess文件实现目录级的局部rewrtie,则为保证rewrite功能正常使用,需要设置AllowOverride选项。
         关于AllowOverwrite的说明,可参考官网文档。关于何时需要利用.htaccess实现rewrite,这篇文章有解释,此处不再赘述。
         2)配置RewrtieRule时,这篇文章提到想要实现POST数据的rewrite,必须设置P Flag,表示force proxy。但我的测试结果表明,不设置P时http post的rewrite可以正常work,相反,如果设置了P flag(在RewriteRule行尾明确指定RewriteRule flag为[P]),则需要下面的第三步设置才能正常实现post的rewrite。囧。。。
         3)关于RewriteRule众多flags的含义,可参考这里。
        经过上面2步,重启Apache后,rewrite功能就可以使用了,测试表明HTTP GET/POST请求的rewrite正常,符合预期。
        不过若在RewriteRule中指定[P],则post方式的rewrite还需要启用Apache的proxy扩展,如本文第3步所述。
3. 启用Apache的proxy扩展(是否需要该步设置视RewriteRule是否指定P flag而定)
         在httpd.conf中启用下面2个扩展模块以实现http post的proxy功能(默认未启用,去掉#注释启用即可):
             LoadModule proxy_module modules/mod_proxy.so
             LoadModule proxy_http_module modules/mod_proxy_http.so
         注:经测试,上面两个扩展缺一不可



==================================================


实例讲解:

要求:文件名中含有hzw时,跳转到err.htm,即hzw.php hzw.htm hzw11.htm等,只要文件名中含有hzw就跳转
Rewrite规则设置如下:
RewriteEngine ON
RewriteCond %{REQUEST_FILENAME}   hzw
RewriteRule .*$    err.htm [NC,R]

讲解:
RewriteCond这一行中%{REQUEST_FILENAME}表示文件名变量,右边的hzw表示匹配值,如果能匹配,就往下执行
RewriteRule这一行, .*$是一个正则表达式语法,表示任何的网址,星号符旁边的$表示未尾匹配,NC表示不区分大小写,R表示外部跳转,即浏览器上面的URL会变化,即符合RewriteCond匹配时,无论是任何网址,都跳转到err.htm


要求:在rewrite中有一些系统变量,如何查看这些变量
解决方法如下:
RewriteEngine ON
RewriteRule .*?/hzw\.htm err.htm?%{HTTP_USER_AGENT}  [NC,R]
讲解:即在跳转的时候,在URL后台加上系统变量即可

 第二种是使用rewrite,需要增加apache的mode_rewrite,支持.htaccess文件目录权限限制

在虚拟主机根目录增加.htaccess文件,描述从定向,把非本地地址refer的图片文件都从定向到警告图片或者警告网页上。

首先要确认你的服务器 或空间的服务器解译引擎为Apache2,还有支持.htaccess客户设置文件,如果你有自己的服务器就请先对./conf/httpd.conf 文件做以下修改 找到:#LoadModule rewrite_module modules/mod_rewrite.so
把前面的 # 给去掉


找到第一个 AllowOverride None 改为 AllowOverride All 重启Apache2服务器

接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为

 

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://aaoo.net/ .*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://aaoo.net $ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net/ .*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.aaoo.net $ [NC]
RewriteRule .*.(jpg|jpeg|gif|png|bmp|rar|zip|exe )$http://down.yoyo.com.ru/err.html [R,NC,L]

   


其中有色的地方都是要改为你的:
 红色 :就是改为你提供下载页面的地址,也就是只有通过这个地址才可以下载你所提供的东东。
 蓝色 :就是要保护文件的扩展名(以|分开),也就是说以这些为扩展名的文件只有通过红色的地址才可以访问。
 绿色 :如果不是通过红色的地址访问蓝色这些为扩展名的文件时就回重定向到绿色地址上。

这个方法有个好处是,不同的虚拟主机用不同的描述定义。

接下就是怎么用 .htaccess 文件来实现防盗链了。首先要在空间上建两个目录(当然目录名随你),一个为 web 另一个为 down ,web 是用来放下载页面的(或下载程序),down 当然就是放你提供的东东的啦,把 .htaccess 文件的红色部分改一下,改为http://你的域名/web。蓝色部分改为你要保护文件的扩展名。绿色部分改为http://你的域名/web。改后保存.htaccess 文件把它上传到 down 目录。

 

 

实例:

 

Java代码  收藏代码
  1. <IfModule mod_rewrite.c>  

  2.   

  3. # 开启Rewrite模块   

  4. RewriteEngine On  

  5.   

  6. # 定义要保护的文件夹,建议只要保护上传文件夹(/wp-content/uploads/)就可以,主题文件夹之类的就算了  

  7. RewriteBase /wp-content/uploads/  

  8.   

  9. #允许空的来源,因为用户可能手动输入图片网址  

  10. RewriteCond %{HTTP_REFERER} !^$ [NC]  

  11.   

  12. #允许自己的网站访问啦   

  13. RewriteCond %{HTTP_REFERER} !photozero.net [NC]  

  14.   

  15. #允许几个常用的在线阅读器的访问   

  16. RewriteCond %{HTTP_REFERER} !zhuaxia.com [NC]  

  17. RewriteCond %{HTTP_REFERER} !xianguo.com [NC]  

  18. RewriteCond %{HTTP_REFERER} !google.com [NC]  

  19. RewriteCond %{HTTP_REFERER} !feedburner.com [NC]  

  20. RewriteCond %{HTTP_REFERER} !feedsky.com [NC]  

  21.   

  22. #括号中的是要保护的文件拓展名,这里只保护了 gif,jpg,png,再加上出错时的图片地址 unavailable.png   

  23. RewriteRule .*\.(gif|jpg|png)$ http://example.com/unavailable.png [R,NC,L]  

  24.   

  25. </IfModule>  

 

简单的解释一下上述语句:

1、RewriteCond %{HTTP_REFERER} !^$ [NC]

允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。

2、RewriteCond %{HTTP_REFERER} !webeta.cn [NC]

设置允许访问的HTTP来源,包括我们的站点自身、Google、Baidu、Bloglines、Feedburner等。

3、RewriteRule .*\.(gif|jpg|png)$ http://www.aaa.com/no.png [R,NC,L]

定义被盗链时替代的图片,让所有盗链 jpg、gif、png 等文件的网页,显示根目录下的 no.png 文件。注意:替换显示的图片不要放在设置防盗链的目录中,并且该图片文件体积越小越好。当然你也可以不设置替换图片,而是使用下面的语句即可:

RewriteRule .*\.(gif|jpg|png)$ - [F]

4、说明一下其中的R、NC 和 L


R 就是转向的意思
NC 指的是不区分大小写
L 的作用是指明本次转向到此结束,后续的转向不受先前判断语句的影响

 

 .htaccess是一个完整的文件名,不是***.htaccess或其它格式(当然也有管理员把其设置 成其它名字,但一般都是使用.htaccess)。另外,上传.htaccess文件时,必须使用ASCⅡ模式,并使用chmod命令改变权限 为:644(RW_R__R__) 。每一个放置.htaccess的目录和其子目录都会被.htaccess影响。例如,在/abc/目录下放置了一 个.htaccess文件,那么/abc/和/abc/def/内所有的文件都会被它影响,但/index.html不会被它影响,这一点是很重要的。

 

 

实例功能 :文档访问的密码保护




有了授权用户文档,可以在.htaccess中加入如下指令了:

Java代码  收藏代码
  1. AuthUserFile .htpasswd的服务器目录  

  2. AuthGroupFile /dev/null (需要授权访问的目录)  

  3. AuthName EnterPassword  

  4. AuthType Basic (授权类型)  

  5. require user wsabstract (允许访问的用户,如果希望表中所有用户都允许,可以使用 require valid-user)   


注,括号部分为学习 时候自己添加的注释


来自 http://justcoding.iteye.com/blog/547364
 

.htaccess 中 %{REQUEST_FILENAME} 及其参数的意思

2009-07-04 09:25Mr_HuaChen | 浏览 0 次  悬赏:15
请教一下,下面的 %{REQUEST_FILENAME}、!-f、!-d、[L] 分别是什么意思呢?谢谢!
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

正确答案
%{REQUEST_FILENAME} 请求的文件名
!-f 不是文件或不存在
!-d 不是目录或不存在
[L] 这是最后一个匹配项,不再往下匹配
来自 http://zhidao.baidu.com/link?url=hmbIqbtua3isnGVg1HWSZHlOenRpHKioHWJXAJZpdK8T20kKsEuYovduJweVeoJ9CJWzog1aKiutLZqF4wsXCK


RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
复制代码代码如下:

RewriteEngine on
RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*
RewriteRule  index.php            index.m.php
RewriteCond  %{HTTP_USER_AGENT}  ^Lynx.*
RewriteRule  index.php            index.L.php 
RewriteRule  index.php            index.b.php

上面语句的作用是当你是用FF浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件,当你是用一些移动终端访问的 时候,会让你对index.php这个文件的访问实际访问的是index.L.php去,如果你是用其它的浏览器访问的时候,会让你跳到 index.b.php。在说形象一点,上面的语句就等同于程序里面的下面语句(依PHP语句为例):
复制代码代码如下:

if($_SERVER['HTTP_USER_AGENT'] == 'Mozilla/5.0')
{
//跳转到对index.m.php的访问
}
else if($_SERVER['HTTP_USER_AGENT'] == 'Lynx')
{
//跳转到对index.L.php的访问
}
else
//跳转到对index.b.php的访问

在看例2:
RewriteCond %{HTTP_REFERER} (www.test.cn)
RewriteRule (.*)$ test.php
上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。
在看例三:
复制代码代码如下:

RewriteCond %{REMOTE_HOST} ^host1.* [OR]
RewriteCond %{REMOTE_HOST} ^host2.* [OR]
RewriteCond %{REMOTE_HOST} ^host3.*
RewriteRule (.*)$ test.php

上面语句的作用是如果你的地址是host1或host2或host3的时候,则就跳到对test.php。从这里可以看出,RewriteCond语句之间默认的是AND,如果想要OR,则要明确的写出来。
下面是自己收藏的一些有用的重写规则:
RewriteCond %{REQUEST_FILENAME} !-f   //如果文件存在,就直接访问文件,不进行下面的RewriteRule.(不是文件或文件不存在就执行重写)
RewriteCond %{REQUEST_FILENAME} !-d   //#如果目录存在就直接访问目录不进行RewriteRule
RewriteCond %{REQUEST_URI} !^.*(/.css|/.js|/.gif|/.png|/.jpg|/.jpeg)$ //#如果是这些后缀的文件,就直接访问文件,不进行Rewrite

来自

http://www.jb51.net/article/39298.htm



使用Apache的模块:rewrite模块语法格式

 by Perchouli

Preface

无论是对于搜索引擎还是对于访客而言,很多网站程序生成的URL并不友好,所以需要将URL以更简短的方式来重写。这种技术可以解决很多常见的问题,如:页面伪静态域名重定向等。URL重写并非只有Apache的rewrite模块能做到,ISAPI也可以实现。但ISAPI只能用于Wndows,国内很多虚拟空间都只支持ISAPI2,功能较弱。rewrite模块的强大在于,他可以用正则来实时重写URL请求,一个规则可以拥有很多子规则、附加条件。

下图是有一条重写条件的重写规则,可以看出Rewrite最基本的格式:重写条件(RewriteCond)是字符串在前,正则在后;重写规则(RewriteRule)是正则在前,字符串在后。本文将从几个简单例子出发,说明一些常用的Rewrite的语法,并解决具体的问题。

EXAMPLE 1

 

 

  • RewriteEngine on:开启Rewrite

  • RewriteCond $1 !(index\.php|images):如果文件不为index.php或目录不为images。

  • RewriteRule ^(.*)$ /index.php?page=$1:转给index.php处理。

$1代表引用RewriteRule中的第一个正则(.*)代表的字符。RewriteCond中的正则很普通,所以不做说明。RewriteRule中的正则,(.*)代表任意字符,^是开始锚,$是结束锚。

设置之后,当访问dmyz.org/about时,实际是访问dmyz.org/index.php?page=about,从url中省略掉了index.php。这一规则经常用于框架开发环境,因为大多数框架都是将所有的请求提交给一个入口文件(通常是index.php)来处理的。

将第三行修改:

访问dmyz.org/about.htm时实际访问的仍然是dmyz.org/index.php?page=about,这就实现简单的伪静态了。

EXAMPLE 2

 

用这个简单的例子来说明重写条件(RewriteCond)使用的服务器变量特殊正则

%{REQUEST_FILENAME}获得一个服务器变量的值,!-f是正则,其中感叹号表否定,-f用来检测当前值所代表的路径是否是一个常规文件。因此例2实现的是:当访问的文件不是一个常规文件时,转到404.htm页面。这就是一个简单的用Rewrite实现404页面重定向的例子。还可以补充一下,将其修改为:

服务器变量有很多,常用的如下表:

服务器变量用途参考
%{HTTP_USER_AGENT}访客的浏览器类型Mozilla/5.0 (X11; U; Linux i686; zh-CN; rv:1.9.2.8) Gecko/20100723 Ubuntu/10.04 (lucid) Firefox/3.6.8GTB7.1
%{HTTP_REFERER}访问的链接地址http://dmyz.org/archives/99
%{HTTP_FORWARDED}通过HTTP获得地址,通常是访客的IP地址,但HTTP头可以修改,所以如果要判断访客的IP,推荐使用%{REMOTE_ADDR}192.168.0.1
%{HTTP_HOST}访问的域名http://dmyz.org
%{SERVER_ADDR}服务器的IP地址127.0.0.1
%{REMOTE_ADDR}访客IP地址192.168.0.1
%{REMOTE_USER}只在HTTP验证中有用,保存验证时使用的用户名admin
%{REQUEST_METHOD}提交查询的方式GET或是POST
%{SCRIPT_FILENAME}所访问的文件的绝对路径/var/www/dmyz.org/htdocs/index.php
%{QUERY_STRING}查询字符串,包含查询变量名和参数page=1&name=dmyz
%{TIME_YEAR}/%{TIME_MON}/%{TIME_DAY}获取年/月/日2010/09/30

EXAMPLE 3

 

本例中使用了配置指令,和重写规则对重写条件的引用。

如例2所说,重写条件可以使用服务器变量和特殊正则,但重写规则不可以。所以需要在重写规则中反向引用重写条件的内容。例3中使用%1来反向引用(.*)?。当查询字符串为pageid=任意字符串时,跳转到thread.php?fid=任意字符串。这条正则很适合网站搬家、更换程序后,将原地址转向到新地址。

前两个例子,重写条件和重写规则都只有两个参数——正则和字符串,本例中追加第三个参数,它被称为标识,跟在重写条件和重写规则之后的,作为辅助、补充之用。本例中使用了最简单三个标识:

  1. [NC]:忽略大小写。

  2. [L]:结尾标识。停止重写操作,并不再应用其他重写规则。防止本条规则被后续规则影响。

  3. [R=301]:利用HTTP 301跳转。

还有其他很有用的标识,可以参考Apache手册


附:最近遇到的几个问题,虽然使用了.htaccess文件,但并未使用rewrite,一并写在这里。设置了Expires headers,关闭了Etag,开启了Wordpress的Gzip压缩。设置之后本站Yslow等级为A。

 

来自 http://dmyz.org/archives/99



下面是自己亲自做的完全正确的有大用的htaccess

AddDefaultCharset UTF-8
ErrorDocument 404 /error/404.html
DirectoryIndex  index.php index.html index.htm default.php
<IfModule mod_rewrite.c>
 
RewriteEngine On
 
#它是301跳转
#RewriteCond %{HTTP_HOST} ^400.com$ [NC]
#RewriteRule ^(.*)$ http://www.400.com/$1 [R=301,L]
 
#RewriteCond %{HTTP_HOST} ^cz.cn$ [NC]
#RewriteRule ^(.*)$ http://www.cz.cn/$1 [R=301,L]
  
#RewriteCond %{REQUEST_URI} !^/pub/  [NC]
#RewriteCond %{REQUEST_URI} !^/uploads/weixin/  [NC]
#它是手机
    
RewriteCond %{HTTP_HOST} sh.com$ [NC]
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|iphone|ipod|opera mobile|palmos|webos" [NC]
RewriteRule ^(.*)$ http://m.sh.com/ [NC,R=301,L]
  
RewriteCond %{HTTP_USER_AGENT} "android|blackberry|googlebot-mobile|iemobile|iphone|ipod|opera mobile|palmos|webos" [NC]
RewriteRule ^(.*)$ http://m.400.com/ [NC,R=301,L]
   
#防止外来网站人员进行报名破坏
RewriteCond %{HTTP_REFERER} !400.com [NC]
RewriteCond %{HTTP_REFERER} !meirongx.com [NC]
RewriteCond %{HTTP_REFERER} !zycmyt.com [NC]
RewriteCond %{HTTP_REFERER} !61af.com [NC]
RewriteCond %{HTTP_REFERER} !halenbar.com [NC]
RewriteCond %{HTTP_REFERER} !efdfd.com [NC]
RewriteCond %{HTTP_REFERER} !cz.cn [NC]
 
RewriteRule php/zaixianbaoming(.*)\.php$ /nolink.txt [R,NC]
  
RewriteRule ^index.html$ index.php
RewriteRule ^index.htm$ index.php
  
#这个是安全 静止php
RewriteCond % !^$  
RewriteRule uploads/(.*).(php)$ – [F]  
RewriteRule data/(.*).(php)$ – [F]  
RewriteRule templets/(.*).(php)$ – [F]
RewriteRule plus/(?!feedback_ajax|count|view|feedback|list)[^>]*.(php)[^>]*$ – [F]
RewriteRule member/(.*).(php)$ – [F]
RewriteRule special/(.*).(php)$ – [F]
#RewriteRule include/(?!vdimgck).{7}.(php)$ – [F] 效果不理想
RewriteRule include/(?!vdimgck|dialog/select_images|dialog/select_soft)[^>]*.(php)$ – [F]
RewriteRule data/(.*).(php)$ – [F]
RewriteRule a/(.*).(php)$ – [F]
RewriteRule images/(.*).(php)$ – [F]
</IfModule>
普通分类: