• server.htaccess 具体解释以及 .htaccess 參数说明


    .htaccess文件(或者”分布式配置文件”)提供了针对文件夹改变配置的方法。 即。在一个特定的文档文件夹中放置一个包括一个或多个指令的文件, 以作用于此文件夹及其所有子文件夹。

    作为用户。所能使用的命令受到限制。管理员能够通过Apache的AllowOverride指令来设置。

    概述来说,htaccess文件是Apacheserver中的一个配置文件,它负责相关文件夹下的网页配置。通过htaccess文件。能够帮我们实现:网页301重定向、自己定义404错误页面、改变文件扩展名、同意/阻止特定的用户或者文件夹的訪问、禁止文件夹列表、配置默认文档等功能。

    .htaccess 具体解释


    .htaccess是什么

    启用.htaccess,须要改动httpd.conf。启用AllowOverride,并能够用AllowOverride限制特定命令的使用。

    假设须要使用.htaccess以外的其它文件名称,能够用AccessFileName指令来改变。比如,须要使用.config ,则能够在server配置文件里按下面方法配置:AccessFileName .config 。

    笼统地说,.htaccess能够帮我们实现包含:文件夹password保护、用户自己主动重定向、自己定义错误页面、改变你的文件扩展名、封禁特定IP地址的用户、仅仅同意特定IP地址的用户、禁止文件夹列表,以及使用其它文件作为index文件等一些功能。

    工作原理

    .htaccess文件(或者”分布式配置文件”)提供了针对每一个文件夹改变配置的方法,即在一个特定的文件夹中放置一个包括指令的文件,当中的指令作用于此文件夹及其全部子文件夹。
    说明:
    假设须要使用.htaccess以外的其它文件名称,能够用AccessFileName指令来改变。

    比如。须要使用.config ,则能够在server配置文件里按下面方法配置:
    AccessFileName .config
    通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件里哪些指令才是有效的。假设一个指令同意在.htaccess中使用,那么在本手冊的说明中,此指令会有一个覆盖项段,当中说明了为使此指令生效而必须在AllowOverride指令中设置的值。

    (不)使用.htaccess文件的场合

    普通情况下。不应该使用.htaccess文件。除非你对主配置文件没有訪问权限。

    有一种非经常见的误解。觉得用户认证仅仅能通过.htaccess文件实现。事实上并非这样。把用户认证写在主配置文件里是全然可行的,并且是一种非常好的方法。


    .htaccess文件应该被用在内容提供者须要针对特定文件夹改变server的配置而又没有root权限的情况下。

    假设server管理员不愿意频繁改动配置,则能够同意用户通过.htaccess文件自己改动配置,尤其是ISP在同一个机器上执行了多个用户网站,而又希望用户能够自己改变配置的情况下。


    尽管如此。一般都应该尽可能地避免使用.htaccess文件。不论什么希望放在.htaccess文件里的配置,都能够放在主配置文件的<Directory>段中,并且更高效。
    避免使用.htaccess文件有两个主要原因。
    首先是性能。

    假设AllowOverride启用了.htaccess文件,则Apache须要在每个文件夹中查找.htaccess文件。因此。不管是否真正用到,启用.htaccess都会导致性能的下降。

    另外。对每个请求,都须要读取一次.htaccess文件。
    还有,Apache必须在全部上级的文件夹中查找.htaccess文件,以使全部有效的指令都起作用(參见指令的生效),所以,假设请求/www/htdocs/example中的页面,Apache必须查找下面文件:
    /.htaccess /www/.htaccess /www/htdocs/.htaccess /www/htdocs/example/.htaccess
    总共要訪问4个额外的文件。即使这些文件都不存在。

    (注意。这可能只因为同意根文件夹”/”使用.htaccess ,尽管这样的情况并不多。

    )

    其次是安全。

    这样会同意用户自己改动server的配置,这可能会导致某些意想不到的改动。所以请认真考虑是否应当给予用户这种特权。可是,假设给予用户较少的特权而不能满足其须要,则会带来额外的技术支持请求。所以,必须明白地告诉用户已经给予他们的权限。说明AllowOverride设置的值,并引导他们參阅对应的说明。以免日后生出很多麻烦。
    注意。在/www/htdocs/example文件夹下的.htaccess文件里放置指令,与在主配置文件里<Directory /www/htdocs/example>段中放置同样指令,是全然等效的。

    /www/htdocs/example文件夹下的.htaccess文件的内容:
    AddType text/example .exm
    httpd.conf文件里摘录的内容:
    <Directory /www/htdocs/example>
    AddType text/example .exm
    </Directory>
    可是,把配置放在主配置文件里更加高效,由于仅仅须要在Apache启动时读取一次,而不是在每次文件被请求时都读取。


    将AllowOverride设置为none能够全然禁止使用.htaccess文件:
    AllowOverride None

    指令的作用范围

    .htaccess文件里的配置指令作用于.htaccess文件所在的文件夹及其全部子文件夹,可是非常重要的、须要注意的是,其上级文件夹也可能会有.htaccess文件,而指令是按查找顺序依次生效的。所以一个特定文件夹下的.htaccess文件里的指令可能会覆盖其上级文件夹中的.htaccess文件里的指令,即子文件夹中的指令会覆盖父文件夹或者主配置文件里的指令。

    疑难解答

    假设在.htaccess文件里的某些指令不起作用。可能有多种原因。


    最常见的原因是AllowOverride指令没有被正确设置,必须确保没有对此文件区域设置 AllowOverride None 。有一个非常好的測试方法,就是在.htaccess文件随便添加点无意义的垃圾内容,假设server没有返回了一个错误消息,那么差点儿能够断定设置了 AllowOverride None 。
    在訪问文档时,假设收到server的出错消息,应该检查Apache的错误日志,能够知道.htaccess文件里哪些指令是不同意使用的,也可能会发现须要纠正的语法错误。

    .htaccess工具

    不会写的朋友,在这介绍一款非常不错.htaccess的重定向—URL重写工具rewriting-tool

    ——————————————————————————–

    htaccess语法教程

    RewriteEngine On
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ /blog/$1
    
    # 没有输入文件名称的默认到到首页
    RewriteCond %{HTTP_HOST} ^(www.)?

    xxx.com$ RewriteRule ^(/)?$ blog/index.php [L]

    以下我開始讲解一下上面的意思:

    RewriteEngine On】

    表示重写引擎开,关闭off,作用就是方便的开启或关闭下面的语句,这样就不须要一条一条的凝视语句了。

    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】

    这是重写条件,前面%{HTTP_HOST}表示当前訪问的网址,仅仅是指前缀部分,格式是www.xxx.com不包含“http://”和“/”,^表示 字符串開始。$表示字符串结尾,.表示转义的. ,假设不转义也行。推荐转义,防止有些server不支持,?表示前面括号www.出现0次或1次,这句规则的意思就是假设訪问的网址是xxx.com或者 www.xxx.com就运行下面的语句,不符合就跳过。

    RewriteCond %{REQUEST_URI} !^/blog/】

    也是重写条件,%{REQUEST_URI}表示訪问的相对地址,就是相对根文件夹的地址,就是域名/后面的成分,格式上包含最前面的“/”,!表示非,这句语句表示訪问的地址不以/blog/开头。仅仅是开头^,没有结尾$

    RewriteCond %{REQUEST_FILENAME} !-f】

    RewriteCond %{REQUEST_FILENAME} !-d】

    这两句语句的意思是请求的文件或路径是不存在的,假设文件或路径存在将返回已经存在的文件或路径

    RewriteRule ^(.*)$ /blog/$1】

    重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会运行此重写规则,^(.*)$是一个正则表达的 匹配,匹配的是当前请求的URL。^(.*)$意思是匹配当前URL随意字符,.表示随意单个字符,*表示匹配0次或N次(N>0),后面 /blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中 的.* ,事实上这儿将会出现一个问题,后面讨论。

    【RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$】

    RewriteRule ^(/)?$ blog/index.php [L]】

    这两句的意思是指请求的host地址是www.xxx.com是。假设地址的结尾仅仅有0个或者1个“/”时,将会重写到子文件夹下的主页,我猜想这主要由于重写后的地址是不能自己主动寻找主页的,须要自己指定。

    如今说说出现的问题。RewriteRule ^(.*)$ /blog/$1 前部分 ^(.*)$ 将会匹配当前请求的url。

    比如:请求网址是http://www.xxx.com/a.html,究竟是匹配整个http://www.xxx.com/a.html,还是仅仅匹配/a.html即反斜杠后面的成分,还是仅仅匹配a.html。

    答案是:依据RewriteBase规则规定。假设rewritebase 为/。将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule ^(.*)$ blog/$1(不带/),只是实际应用上带上前面的反斜杠,也能够用,可能带不带都行。

    如今问题出来了,假设不设置rewritebase 为/ 。将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该加入这条:RewiteBase /

    另一个问题是,不能保证每一个人输入的网址都是小写的,假设输入大写的呢,linux系统是区分大写和小写的,所以应该在RewriteCond后加入[NC]忽略大写和小写的。

    至此,完整的语句应该是:

    RewriteEngine On
    RewiteBase /
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteCond %{REQUEST_URI} !^/blog/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ blog/$1
    
    # 没有输入文件名称的默认到到首页
    RewriteCond %{HTTP_HOST} ^(www.)?xxx.com$ [NC]
    RewriteRule ^(/)?

    $ blog/index.php [L]

    假设后面还继续有语句的,就不应该加上最后的[L],由于这是表示最后一条语句的意思。

    防盗链的语句,相同须要加入RewiteBase /。例如以下:

    RewriteEngine on
    RewiteBase /
    RewriteCond %{HTTP_REFERER} !^$ [NC]
    RewriteCond %{HTTP_REFERER} !xxx.info [NC]
    RewriteRule .(jpg|gif|png|bmp|swf|jpeg)$ /error/daolian.gif [R,NC,L]

    假设后面还继续有语句的,就不应该加上最后的[L],/error/daolian.gif为别人盗链时显示的图片。

    以下附上简单的语法规则和flags

    【RewriteCond语法】

    RewriteCond TestString CondPattern [flags]

    rewritecond的其它使用方法:

    “-d”(文件夹)

    将TestString视为一个路径名并測试它是否为一个存在的文件夹。

    “-f”(常规文件)

    将TestString视为一个路径名并測试它是否为一个存在的常规文件。

    “-s”(非空的常规文件)

    将TestString视为一个路径名并測试它是否为一个存在的、尺寸大于0的常规文件。

    “-l”(符号连接)

    将TestString视为一个路径名并測试它是否为一个存在的符号连接。

    “-x”(可运行)

    将TestString视为一个路径名并測试它是否为一个存在的、具有可运行权限的文件。该权限由操作系统检測。

    “-F”(对子请求存在的文件)

    检查TestString是否为一个有效的文件,并且能够在server当前的訪问控制配置下被訪问。

    它使用一个内部子请求来做检查。因为会减少server的性能,所以请慎重使用!

    “-U”(对子请求存在的URL)

    检查TestString是否为一个有效的URL,并且能够在server当前的訪问控制配置下被訪问。

    它使用一个内部子请求来做检查,因为会减少server的性能,所以请慎重使用!

    【RewriteRule语法:】

    RewriteRule Pattern Substitution [flags]

    【flags】

    “chain|C”(链接下一规则)

    此标记使当前规则与下一个规则相链接。

    它产生这种效果:假设一个规则被匹配,则继续处理其后继规则。也就是这个标记不起作用;假设该规则不被匹配。则其后继规则将被跳过。

    比方,在一个文件夹级规则中运行一个外部重定向时。你可能须要删除”.www”(此处不应该出现”.www”)。

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

    在client设置一个cookie。cookie的名称是NAME,值是VAL。domain是该cookie的域,比方”.apache.org”。可选的lifetime是cookie的有效期(分钟)。可选的path是cookie的路径。

    “env|E=VAR:VAL”(环境变量设置)

    此标记将环境变量VAR的值为VAL,VAL能够包括可扩展的正則表達式反向引用($N和%N)。

    此标记能够多次使用以设置多个变量。这些变量能够在其后很多情况下被间接引用。一般是在XSSI(<!–#echo var=”VAR”–>)或CGI($ENV{“VAR”})中,也能够在后继的RewriteCond指令的CondPattern參数中通过%{ENV:VAR}引用。使用它能够记住从URL中剥离的信息。

    “forbidden|F”(强制禁止URL)

    强制禁止当前URL,也就是马上反馈一个HTTP响应码403(被禁止的)。

    使用这个标记。能够链接若干个RewriteConds来有条件地堵塞某些URL。

    “gone|G”(强制废弃URL)

    强制当前URL为已废弃,也就是马上反馈一个HTTP响应码410(已废弃的)。

    使用这个标记,能够标明页面已经被废弃而不存在了。

    “handler|H=Content-handler”(强制指定内容处理器)

    强自制定目标文件的内容处理器为Content-handler。

    比如,用来模拟mod_alias模块的ScriptAlias指令,以强制映射目录内的全部文件都由”cgi-script”处理器处理。

    “last|L”(结尾规则)

    马上停止重写操作,并不再应用其它重写规则。

    它相应于Perl中的last命令或C语言中的break命令。这个标记用于阻止当前已被重写的URL被后继规则再次重写。

    比如,使用它能够重写根路径的URL(“/”)为实际存在的URL(比方:”/e/www/”)。

    “next|N”(从头再来)

    又一次运行重写操作(从第一个规则又一次開始)。此时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理过的URL。

    它相应于Perl中的next命令或C语言中的continue命令。此标记能够又一次開始重写操作(马上回到循环的开头)。可是要小心,不要制造死循环!

    “nocase|NC”(忽略大写和小写)

    它使Pattern忽略大写和小写。也就是在Pattern与当前URL匹配时。”A-Z”和”a-z”没有差别。

    “noescape|NE”(在输出中不正确URI进行转义)

    此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 普通情况下,特殊字符(“%”, “$”, “;”等)会被转义为等值的十六进制编码(“%25′, “%24′, “%3B”等)。此标记能够阻止这种转义,以同意百分号等符号出如今输出中。比方:

    RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

    能够使”/foo/zed转向到一个安全的请求”/bar?arg=P1=zed”。

    “nosubreq|NS”(不正确内部子请求进行处理)

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

    使用原则:假设你为URL加入了CGI脚本前缀,以强制它们由CGI脚本处理,但对子请求处理的出错率(或者资源开销)非常高,在这样的情况下,能够使用这个标记。

    “proxy|P”(强制为代理)

    此标记使替换成分被内部地强制作为代理请求发送,并马上中断重写处理。然后把处理移交给mod_proxy模块。你必须确保此替换串是一个可以被mod_proxy处理的有效URI(比方以http://hostname开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地server域名空间,从而增强了ProxyPass指令的功能。

    注意:要使用这个功能,必须已经启用了mod_proxy模块。

    “passthrough|PT”(移交给下一个处理器)

    此标记强制重写引擎将内部request_rec结构中的uri字段设置为filename字段的值。这个小小的改动使得RewriteRule指令的输出可以被(从URI转换到文件名称的)Alias, ScriptAlias, Redirect等指令进行兴许处理[原文:This flag is just a hack to enable post-processing of the output of RewriteRule directives, using Alias, ScriptAlias, Redirect, and other directives from various URI-to-filename translators.]。举一个能说明其含义的样例: 假设要将/abc重写为/def。 然后再使用mod_alias将/def转换为/ghi,能够这样:

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

    Alias /def /ghi

    假设省略了PT标记。尽管将uri=/abc/…重写为filename=/def/…的部分运作正常,可是兴许的mod_alias在试图将URI转换到文件名称时会遭遇失效。

    注意:假设须要混合使用多个将URI转换到文件名称的模块时,就必须使用这个标记。

    。此处混合使用mod_alias和mod_rewrite就是个典型的样例。

    “qsappend|QSA”(追加查询字符串)

    此标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。假设须要通过重写规则在请求串中添加信息,就能够使用这个标记。

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

    若Substitution以http://thishost[:thisport]/(使新的URL成为一个URI)开头,能够强制性运行一个外部重定向。

    假设没有指定code。则产生一个HTTP响应码302(暂时性移动)。假设须要使用在300-400范围内的其它响应代码,仅仅需在此指定就可以(或使用下列符号名称之中的一个:temp(默认), permanent, seeother)。使用它能够把规范化的URL反馈给client,如将”/~”重写为”/u/”,或始终对/u/user加上斜杠,等等。

    注意:在使用这个标记时。必须确保该替换字段是一个有效的URL。否则。它会指向一个无效的位置。而且要记住,此标记本身仅仅是对URL加上http://thishost[:thisport]/前缀,重写操作仍然会继续进行。

    通常,你还会希望停止重写操作而马上重定向。那么就还须要使用”L’标记。

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

    此标记强制重写引擎跳过当前匹配规则之后的num个规则。它能够模拟if-then-else结构:最后一个规则是then从句,而被跳过的skip=N个规则是else从句。注意:它和”chain|C”标记是不同的!

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

    强制目标文件的MIME类型为MIME-type,能够用来基于某些特定条件强制设置内容类型。比方,以下的指令能够让.php文件在以.phps扩展名调用的情况下由mod_php依照PHP源码的MIME类型(application/x-httpd-php-source)显示:

    RewriteRule ^(.+.php)s$ $1 [T=application/x-httpd-php-source]

    .htaccess实例

    http://cloudbbs.org/forum.php?mod=viewthread&tid=7455&page=1&extra=#pid41053

    http://www.chinaz.com/web/2010/0415/111514.shtml

    參考:http://baike.baidu.com/view/91163.htm

    http://hi.baidu.com/wojiubaibudu/item/4b3513c74a8fe47aced4f817

    .htaccess rewrite 规则具体说明

     

    来源网址: http://www.cnphp.info/htaccess-rewrite.html

    作者: freemouse 日期 2010年07月22日 | 能够转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明

    网址: http://www.cnphp.info/htaccess-rewrite.html

    用Apache虚拟主机的朋友非常多,apache提供的.htaccess模块能够为每一个虚拟主机设定rewrite规则,这对站点SEO优化相当实用。同一时候也改善了用户体验。

    国内的虚拟机一般不提供.htaccess功能(据我所知。discuz的主机好像提供此功能),而在国外主机中。.htaccess功能似乎是标配,笔者的Blog架在MT上,支持.htaccess,每次看到一堆别人写好了的.htaccess设置。非常多命令都不甚了了,查看、改动起来非常不方便。痛定思痛,潜心学习一下,知其所以然嘛~

    学习前提:(不会的朋友要学习一下,才干更好的理解以下的文字呢)

    • Linux基础(不会也没事啦,写个.htaccess不是必需大费周折啦,推荐:鸟哥私房菜linux基础)
    • 正則表達式(Rewrite规则建立在正则的基础之上。推荐:正則表達式30分钟新手教程)

    rewrite的语法格式

    1. RewriteEngine On #要想rewrite起作用,必需要写上哦
    2. RewriteBase url-path #设定基准文件夹。比如希望对根文件夹下的文件rewrtie,就是”/”
    3. RewriteCond test-string condPattern #写在RewriteRule之前,能够有一或N条,用于測试rewrite的匹配条件,具体怎么写,后面会具体说到。
    4. RewriteRule Pattern Substitution #规则

    RewriteEngine On|Off

    RewriteEngine 用于开启或停用rewrite功能。

    rewrite configurations 不会自己主动继承,因此你得给每一个你想用 rewrite功能的虚拟主机文件夹中加上这个指令。

    RewriteBase URL-path

    RewriteBase用于设定重写的基准URL。在下文中,你能够看见RewriteRule能够用于文件夹级的配置文件里 (.htaccess)并在局部范围内起作用。即规则实际处理的仅仅是剥离了本地路径前缀的一部分。处理结束后,这个路径会被自己主动地附着回去。默认值 是”RewriteBase physical-directory-path”。

    在对一个新的URL进行替换时,此模块必须把这个URL又一次注入到server处理中。为此。它必须知道其相应的URL前缀或者说URL基准。

    通常,此前缀就是 相应的文件路径。

    可是,大多数站点URL不是直接相应于其物理文件路径的,因而一般不能做这种假定! 所以在这种情况下。就必须用RewriteBase指令来指定正确的URL前缀。

    假设你的站点serverURL不是与物理文件路径直接相应的,而又须要使用RewriteBase指令,则必须在每一个相应的.htaccess文件里指定 RewriteRule 。

    RewriteCond TestString CondPattern [flags]

    RewriteCond指令定义了一个规则的条件,即。在一个RewriteRule指令之前有一个或多个RewriteCond指令。

    条件之后的重写规则仅在当前URI与pattern匹配而且符合这些条件的时候才会起作用。

    TestString是一个纯文本的字符串,可是还能够包括下列可扩展的成分:

    1. RewriteRule反向引用: 引用方法是 $N  (0 <= N <= 9) 引用当前(带有若干RewriteCond指令的)RewriteRule中的 与pattern匹配的分组成分(圆括号!)。
    2. RewriteCond反向引用: 引用方法是 %N  (1 <= N <= 9) 引用当前若干RewriteCond条件中最后符合的条件中的分组成分(圆括号!)。
    3. RewriteMap 扩展: 引用方法是 ${mapname:key|default}
    4. server变量: 引用方法是 %{ NAME_OF_VARIABLE }  这个是我们最常使用到的功能

    NAME_OF_VARIABLE详细数值见下表:

    HTTP headers:

    connection & request:

    HTTP_USER_AGENT

    HTTP_REFERER

    HTTP_COOKIE

    HTTP_FORWARDED

    HTTP_HOST

    HTTP_PROXY_CONNECTION

    HTTP_ACCEPT

    REMOTE_ADDR

    REMOTE_HOST

    REMOTE_USER

    REMOTE_IDENT

    REQUEST_METHOD

    SCRIPT_FILENAME

    PATH_INFO

    QUERY_STRING

    AUTH_TYPE

    server internals:

    system stuff:

    specials:

    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

    这些都相应于类似命名的HTTP MIME头、Apacheserver的C变量以及Unix系统中的 struct tm字段,大多数都在其它的手冊或者CGI规范中有所讲述。

    而当中为mod_rewrite所特有的变量有:

    IS_SUBREQ

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

    API_VERSION

    这是正在使用的httpd中(server和模块之间内部接口)的Apache模块API的版本号, 其定义位于include/ap_mmn.h中。此模块版本号相应于正在使用的Apache的版本号 (比方,在Apache 1.3.14的发行版中,这个值是19990320:10)。

    通常,对它感兴趣的是模块的作者。

    THE_REQUEST

    这是由浏览器发送给server的完整的HTTP请求行。(比方, “GET /index.html HTTP/1.1″). 它不包括不论什么浏览器发送的附加头信息。

    REQUEST_URI

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

    REQUEST_FILENAME

    这是与请求相匹配的完整的本地文件系统的文件路径名或描写叙述.

    CondPattern是条件pattern, 即, 一个应用于当前实例TestString的正則表達式, 即, TestString将会被计算然后与CondPattern匹配.

    注意:CondPattern是一个兼容perl的正則表達式。 可是还有若干补充:

    1. 能够在pattern串中使用’
      1
      !

      ‘ 字符(惊叹号)来实现匹配的反转

    RewriteOptions Options

    1
    RewriteOptions

    指令为当前server级和文件夹级的配置设置一些选项。

     Option能够是下列值之中的一个:

    1
    inherit
    此值强制当前配置能够继承其父配置。 在虚拟主机级配置中,它意味着主server的映射表、条件和规则能够被继承。 在文件夹级配置中,它意味着其父文件夹的
    1
    .htaccess

    中的条件和规则能够被继承。

    1
    MaxRedirects=<var>number</var>
    为了避免文件夹级
    1
    RewriteRule

    的无休止的内部重定向, 在此类重定向和500内部server错误次数达到一个最大值的时候。

    1
    mod_rewrite

    会停止对此请求的处理。 假设你确实须要对每一个请求同意大于10次的内部重定向,能够增大这个值。

    RewriteRule Pattern Substitution [flags]

    1
    RewriteRule

    指令是重写引擎的根本。此指令能够多次使用。 每一个指令定义一个简单的重写规则。这些规则的定义顺序尤为重要, 由于,在执行时刻,规则是按这个顺序逐一生效的.

    Pattern是一个作用于当前URL的兼容perl的正則表達式。

    此外,还能够使用否字符(‘

    1
    !

    ‘)的pattern前缀,以实现pattern的反转。可是,须要注意的是使用否字符以反转pattern时。pattern中不能使用分组的通配成分;即$N。

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

    除了纯文本,还能够使用

    • 1
      $N

      反向引用RewriteRule的pattern

    • 1
      %N

      反向引用最后匹配的RewriteCond pattern

    • 规则条件測试字符串中(
      1
      %{VARNAME}

      )的server变量

    • 映射函数调用(
      1
      ${mapname:key|default})
    以下给出几个完整的样例供各位參考:

    一、防盗链功能

    仅仅这四行就实现了防盗链是不是非常奇妙^_^,编写起来是不是又认为复杂。

    RewriteEngine On

    RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]

    RewriteCond %{HTTP_REFERER} !^$

    RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

    二、网址规范化

    这个是把全部二级域名都重定向到www.yourdomain.com的样例,如今看来是不是非常easy了?

    Options +FollowSymLinks

    rewriteEngine on

    rewriteCond %{http_host} ^yourdomain.com [NC]

    rewriteRule ^(.*)$ http://www.yourdomain.com/$1 [R=301,L]

    三、暂时错误页面

    当你的站点在升级、改动的时候,你最好让訪客转到指定的页面,而不是没做完的页面或者是错误页。

    RewriteEngine on

    RewriteCond %{REQUEST_URI} !/maintenance.html$

    RewriteCond %{REMOTE_ADDR} !^123.123.123.123

    RewriteRule $ /error.html [R=302,L]

    四、重定向RSS地址到FeedSky

    除了能够更改模板里的RSS地址外,.htaccess也能实现RSS地址的更改,并更加方便。

    RewriteEngine on

    RewriteCond %{HTTP_USER_AGENT} !FeedSky [NC]

    RewriteCond %{HTTP_USER_AGENT} !FeedValidator [NC]

    RewriteRule ^feed/?([_0-9a-z-]+)?

    /?

    $ http://feed.feedsky.com/yours

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

    附录:flags

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

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

      注意: 在使用这个标记时。必须确保该替换字段是一个有效的URL! 否则。它会指向一个无效的位置! 而且要记住,此标记本身仅仅是对URL加上 http://thishost[:thisport]/的前缀。重写操作仍然会继续。

      通常。你会希望停止重写操作而马上重定向。则还须要使用’L’标记.

    2. ‘forbidden|F’ (强制URL为被禁止的 forbidden)

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

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

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

    4. ‘proxy|P’ (强制为代理 proxy)

      此标记使替换成分被内部地强制为代理请求,并马上(即, 重写规则处理马上中断)把处理移交给代理模块。

      你必须确保此替换串是一个有效的(比方常见的以 http://hostname开头的)能够为Apache代理模块所处理的URI。

      使用这个标记,能够把某些远程成分映射到本地server名称空间, 从而增强了ProxyPass指令的功能。 注意: 要使用这个功能,代理模块必须编译在Apacheserver中。 假设你不能确定,能够检查“httpd -l”的输出中是否有mod_proxy.c。 假设有,则mod_rewrite能够使用这个功能; 假设没有,则必须启用mod_proxy并又一次编译“httpd”程序。

    5. ‘last|L’ (最后一个规则 last)

      马上停止重写操作,并不再应用其它重写规则。 它相应于Perl中的last命令或C语言中的break命令。

      这个标记能够阻止当前已被重写的URL为其后继的规则所重写。 举例,使用它能够重写根路径的URL(‘/’)为实际存在的URL, 比方, ‘/e/www/’.

    6. ‘next|N’ (又一次运行 next round)

      又一次运行重写操作(从第一个规则又一次開始). 这时再次进行处理的URL已经不是原始的URL了,而是经最后一个重写规则处理的URL。

      它相应于Perl中的next命令或C语言中的continue命令。 此标记能够又一次開始重写操作,即, 马上回到循环的头部。 可是要小心,不要制造死循环!

    7. ‘chain|C’ (与下一个规则相链接 chained)

      此标记使当前规则与下一个(其本身又能够与其后继规则相链接的。 并能够如此重复的)规则相链接。 它产生这样一个效果: 假设一个规则被匹配,一般会继续处理其后继规则。 即。这个标记不起作用;假设规则不能被匹配。 则其后继的链接的规则会被忽略。

      比方。在运行一个外部重定向时。 对一个文件夹级规则集。你可能须要删除“.www” (此处不应该出现“.www”的)。

    8. ‘type|T=MIME-type’ (强制MIME类型 type)

      强制目标文件的MIME类型为MIME-type。 比方,它能够用于模拟mod_alias中的ScriptAlias指令, 以内部地强制被映射文件夹中的全部文件的MIME类型为“application/x-httpd-cgi”.

    9. ‘nosubreq|NS’ (仅用于不正确内部子请求进行处理 no internal sub-request)

      在当前请求是一个内部子请求时。此标记强制重写引擎跳过该重写规则。 比方,在mod_include试图搜索可能的文件夹默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求。它不一定实用的。并且假设整个规则集都起作用, 它甚至可能会引发错误。

      所以,能够用这个标记来排除某些规则。 依据你的须要遵循下面原则: 假设你使用了有CGI脚本的URL前缀。以强制它们由CGI脚本处理。 而对子请求处理的出错率(或者开销)非常高。在这样的情况下,能够使用这个标记。

    10. ‘nocase|NC’ (忽略大写和小写 no case)

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

    11. ‘qsappend|QSA’ (追加请求串 query string append)

      此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 假设须要通过重写规则在请求串中添加信息。就能够使用这个标记。

    12. ‘noescape|NE’ (在输出中不正确URI作转义 no URI escaping)

      此标记阻止mod_rewrite对重写结果应用常规的URI转义规则。 普通情况下,特殊字符(如’%’, ‘$’, ‘;’等)会被转义为等值的十六进制编码。 此标记能够阻止这种转义,以同意百分号等符号出如今输出中,如: RewriteRule /foo/(.*) /bar?arg=P1\%3d$1 [R,NE]

      能够使’/foo/zed’转向到一个安全的请求’/bar?arg=P1=zed’.

    13. ‘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。

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

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

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

      此标记使环境变量VAR的值为VAL, VAL能够包括可扩展的反向引用的正則表達式$N和%N。 此标记能够多次使用以设置多个变量。

      这些变量能够在其后很多情况下被间接引用,但一般是在XSSI (via or CGI (如 $ENV{‘VAR’})中。 也能够在后继的RewriteCond指令的pattern中通过%{ENV:VAR}作引用。

      使用它能够从URL中剥离并记住一些信息。

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

      它在client浏览器上设置一个cookie。 cookie的名称是NAME,其值是VAL。

      domain字段是该cookie的域,比方’.apache.org’, 可选的lifetime是cookie生命期的分钟数。 可选的path是cookie的路径。

    深入阅读:http://oss.org.cn/man/newsoft/ApacheManual/mod/mod_rewrite.html

    全面理解.htaccess语法中RewriteCond和RewriteRule意义

     

    来源网址: http://blog.sina.com.cn/s/blog_7048e38101017xdx.html

    (2012-08-13 10:38:44)

    关于.htaccess伪静态的使用,章郎虫一直没有好好想过。曾经一直是在网上找现成的,然后改动下网址实现重定向。今天我专门找资料看了下RewriteCond和RewriteRule的意思及用法。然后回过头看《站点地址更改之htaccess和php的301重定向》这篇文章,最终有些理解。如今不用一直找现成的代码。也能够自己写一些规则实现重定向了。以下就简单的介绍下他们的用法。

    RewriteCond的语法

    RewriteCond TestString CondPattern [Flags]

    当中的TestString是指一个文本格式的条件,样例中用的是环境变量名HTTP_HOST所包括的内容(Name= Value),这是一个map(键值对)格式的数据类型。

    CondPattern是条件參数,这儿以第一个样例为例,就是abc.com。

    Flags标识是是第三个參数,能够用来紧跟下一个条件,这儿用OR表示或者,假设没有[Flags],则用隐含的AND,表示而且。

    其他的还能够NC等等,表示忽略大写和小写

    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。

    RewriteRule的语法

    RewriteRule Pattern Substitution [Flags]

    当中的Pattern就是參数。一般为一些文件的扩展名。Substitution是用来替换前面用的,这儿的Flags,经常使用的R表示 redirect(强制重定向),F表示forbidden(禁止訪问)。L表示last(最后),通常当你希望停止重写操作而马上重定向时,可用它。

    .htaccess中用到的正则

    元字符^(和数字6在同一个键位上的符号)和$都匹配一个位置,这和有点类似。

    ^匹配你要用来查找的字符串的开头

    $匹配结尾。

    比方一个站点假设要求你填写的QQ号必须为5位到12位数字时,能够使用:^d{5,12}$。

    假设你对正則表達式不是非常明确。能够看下正則表達式的教程

    Source from: http://www.hellonet8.com/897.html

     

    URL重写 htaccess文件写法的10个技巧

     

    来源网址: http://blog.sina.com.cn/s/blog_7069146d01015ikf.html

    (2012-07-26 03:25:44)

    “.htaccess”文件往往被网页设计师们忽略。假如你还不知道什么是htaccess的话,你能够去查一下wikipedia。

    它是文件夹级别的配置文件,有经常使用的网页server支持这样的配置,比如Apache。以下我将列出10条实用的.htaccess配置技巧。

    1. 反盗链

    那些盗用了你的内容,还不愿意自己存储图片的站点是无耻的。你能够通过下面配置来放置别人盗用你的图片:

    RewriteBase /

    RewriteCond %{HTTP_REFERER} !^$

    RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/.*$ [NC]

    RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

    2. 防止文件夹浏览

    有时候文件夹浏览是实用的。但大部分情况会有安全问题。为了让你的站点更安全。你能够通过htaccess文件来禁用这个功能:

    Options All -Indexes

    3. SEO友好的301永久重定向

    这一招是我经常使用的。每次我更改站点URL结构的时候。我都会做301重定向:

    Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article 4. 显示个性化的 404 错误页面

    当用户訪问了一个不存在的页面的时候,网页server会显示“404 file not found”错误。有非常多CMS能够让你设置自己定义的错误页面,但最简单的方法是更改htaccess:

    ErrorDocument 404 /404.html

    5. 设置文件夹的默认页面

    假如你须要为不同的文件夹设置不同的默认页面,你能够非常easy的通过 .htaccess 实现:

    DirectoryIndex about.html

    6. 基于referer来限制站点訪问

    站长通常不会限制站点訪问,可是当你发现有一些站点尽给你带来垃圾流量的话。你就应该屏蔽他们:

    <IfModule mod_rewrite.c>

    RewriteEngine on  RewriteCond %{HTTP_REFERER} spamteam.com [NC,OR]

    RewriteCond %{HTTP_REFERER} trollteam.com [NC,OR]

    RewriteRule .* – [F]

    </ifModule>

    7. 限制PHP上传文件大小

    这招在共享空间的server上非常实用,能够让我的用户上传更大的文件。

    第一个是设置最大的上传文件大小。第二个是设置最大的POST请求大小,第三个PHP脚本最长的运行时间,最后一个是脚本解析上传文件的最长时间:

    php_value upload_max_filesize 20M

    php_value post_max_size 20M

    php_value max_execution_time 200

    php_value max_input_time 200

    8. 压缩文件

    你能够通过压缩文件来降低网络流量,也页面装载时间:

    AddOutputFilterByType DEFLATE text/plain

    AddOutputFilterByType DEFLATE text/html

    AddOutputFilterByType DEFLATE text/xml

    AddOutputFilterByType DEFLATE text/css

    AddOutputFilterByType DEFLATE application/xml

    AddOutputFilterByType DEFLATE application/xhtml+xml

    AddOutputFilterByType DEFLATE application/rss+xml

    AddOutputFilterByType DEFLATE application/javascript

    AddOutputFilterByType DEFLATE application/x-javascript

    9. 缓存文件

    这一点还须要解释吗?

    <FilesMatch “.(flv|gif|jpg|jpeg|png|ico|swf|js|css|pdf)$”>

    Header set Cache-Control “max-age=2592000〃

    </FilesMatch>

    10. 加入尾部的反斜杠

    我并不确定。可是非常多文章。非常多人都说加入尾部反斜杠故意于SEO:

    <IfModule mod_rewrite.c>

    RewriteCond %{REQUEST_URI} /+[^.]+$

    RewriteRule ^(.+[^/])$ %{REQUEST_URI}/ [R=301,L]

    </IfModule>

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

    引用:http://www.c658.com/658/html/xxlm/itxxl/882.html

    .htaccess基本的语法和应用

    .htaccess是Apacheserver的一个很强大的分布式配置文件。

    正确的理解和使用.htaccess文件,能够帮助我们优化自己的server或者虚拟主机。

    怎样启用htaccess

    以windows为例,进入apache/conf文件夹,找到httpd.conf文件。去掉

    LoadModule rewrite_module modules/mod_rewrite.so

    前面的#,然后设置文件夹属性AllowOverride All,重新启动apache就可以

    以下是一个典型的htaccess文件

               # 开启URL重写
    RewriteEngine on
    # URL重写的作用域
    # RewriteBase /path/to/url
    # 满足如何的条件
    RewriteCond %{HTTP_HOST} !^www.example.com$ [NC]
    # 应用如何的规则
    RewriteRule .?

    http://www.example.com%{REQUEST_URI} [R=301,L]

    来看看RewriteCond,首先有一个%,由于{HTTP_HOST}是一个apache变量。须要用%来指示。

    从!開始就是匹配的条件。支持 正则。!表示不等于,这句话的意思就是:假设HTTP_HOST不是www.example.com。后面的[NC](no case)表示忽略大写和小写。常见的还有

    • [L](last):终止一系列的RewriteCond和RewriteRule
    • [R](redirect):触发一个显示的跳转,也能够指定跳转类型,如[R=301]
    • [F](forbidden):禁止查看特定文件,apache会触发403错误

    图片防盗链

               RewriteCond %{HTTP_REFERER} !^$
    RewriteCond %{HTTP_REFERER} !^http://(www.)?

    example.com/ [NC] RewriteRule .(gif|jpg|png)$ - [F]

    由于是基于HTTP_REFERER的验证。所以仅仅能防止一般的图片盗链,由于HTTP_REFERER是比較easy伪造的

    自己定义404错误页面

    假设用户输入了一个不存在的url,那么就显示自己定义的错误页面

               ErrorDocument 404 /404.html
    # 其它同理
    ErrorDocument 500 /500.html

    处理移动过的文件

               Redirect 301 /old.html http://yoursite.com/new.html
    # 也能够是以下这样
    RewriteRule /old.html http://yoursite.com/new.html [R=301,L]
    # 假设想隐式跳转(URL地址不变。但实际上内容是其它URL的),就使用以下的
    RewriteRule /old.html http://yoursite.com/new.html [L]

    对于RewriteRule还有好多文章能够做,比方

               # 把html后缀的url链接到php文件
    # $1指代的是前面第1个用括号括起来的内容
    RewriteRule ^/?([a-z/]+).html$ $1.php [L]
    # 或者把旧目录的内容链接到新目录
    RewriteRule ^/?old_directory/([a-z/.]+)$ new_directory/$1 [R=301,L]
    # 隐藏文件名称
    RewriteRule ^/?([a-z]+)$ $1.php [L]
    禁止显示文件夹列表

    假设文件夹里没有index文件,又没有对该文件夹做过特别的处理,尤其是windows主机。那么该文件夹里的内容就会显示出来,这时能够在根文件夹创建 一个.htaccess文件,然后写上

               Options -Indexes
    # 就这么一句就搞定了

    阻止/同意特定IP/IP段

               # 禁止全部IP,除了指定的
    order deny,allow
    deny from all
    # 假设想同意IP段。如123.123.123.0 ~ 123.123.123.255,则
    # allow from 123.123.123.
    allow from 123.123.123.123
    
    ErrorDocument 403 /page.html
    
    <Files page.html>
    allow from all
    </Files>
    
    #假设想禁止特定IP
    deny from 123.123.123.123

    加入MIME类型

               AddType video/x-flv .flv
    # 假设设置类型为 application/octet-stream 将提示下载
    AddType application/octet-stream .pdf

    用.htaccess文件实现站点404错误

     

    来源网址: http://www.os1010.com/archives/618

    作者:admin  发表于:2012年06月11日 09:25  分类:SEO技术     字体: 小 中 

    定义404错误 页对站点SEO的作用还是非常大的。404 错误意味着链接指向的网页不存在,即原始网页的URL失效。这样的情况常常会发生,非常难避免,当Web server接到类似请求时。会返回一个404 状态码,告诉浏览器要请求的资源并不存在。

    可是,Webserver默认的404错误页面,十分呆板,并且对SEO是不利,对于站点流量也是非常大的损失。

    如今大多数主机都提供设置404页面的接口,这种不管是国内主机还是国外主机都非常好设置。只是仍然有不少主机不提供设置页面,这种多是国内主机和一些免费主机,本文主要是针对这些主机。并且是针对PHP主机。

    1. Apache下设置404错误页面(通常是Linux主机)

    (1)           在.htaccess 文件(假设没有则新建一个)中增加例如以下内容:ErrorDocument 404 /404.html,将.htaccess文件上传到站点根文件夹

    注:也能够使用这种命令

    ErrorDocument 404 http://www.iewb.net/404.htm

    ErrorDocument 500 http://www.iewb.net/500.htm

    (2)           制作一个404页面,随便您设计,命名为404.html,相同上传到站点根文件夹。假设您还想设置500页面,还能够在.htaccess命令里加上ErrorDocument 404 /500.html 并制作一个500页面传到站点根文件夹

    网友不必检验本站的404页面了,由于本站用的是godaddy免费的空间。404页面会有广告。

    本文由新未来博客(www.os1010.com)整理,转载请注明!

    本文固定链接: http://www.os1010.com/archives/618 | WordPress主机|香港主机空间|香港快速主机|新未来博客

    由浅入深剖析.htaccess

     

    来源网址: http://blog.csdn.net/cdefg198/article/details/6645759

    2011-07-29 23:36 210人阅读 评论(0) 收藏 举报

    1、.htaccess文件使用前提

    .htaccess的主要作用就是实现url改写,也就是当浏览器通过url訪问到server某个目录时。作为主人,我们能够来接待这个url,详细地如何接待它。就是此文件的作用。全部的訪问都是通过URL实现,所以.htaccess的作用非同小可。正由于此,所以一般地站点通过设置.htaccess。通过一个十分友好的url吸引用户进来,然后用.htaccess把用户带到须要訪问的位置。

    要想使用这个强大功能,就得开启apache里面的重写模块。

    前面的文章中以前讲到过windows和ubuntu开启 rewrite模块使用.htaccess 。

    事实上开启模块大体的步骤都是一样的,不管是Windows和linux。

    2、.htaccess基本的语法介绍

    开启重写引擎 :RewriteEngine on

    设置重写的根文件夹:RewriteBase /     — 说明 :由于定义了这个文件夹,所以相应的替换就有了一个參照。

    匹配全部符合条件的请求:RewriteCond       — 说明:RewriteCond 定义了一系列规则条件,这个指令能够有一条或者多条,仅仅实用户拿来的url符合这些条件之后,我们的.htaccess才開始接待,否则用户就直接自己去訪问所须要的文件夹了。

    举个样例,为了能让搜索引擎很多其它地抓取我们的网页而避免反复抓,我们通常把没有www的域名重定向到www.XXX.com,例如以下就实现了这个功能:

    RewriteEngine On

    RewriteCond %{HTTP_HOST}  ^nbphp.com$ [NC]

    RewriteRule ^(.*)$  http://www.nbphp.com/$1 [R=301,L]

    上例便把nbphp.com 重定向到www.nbphp.com

    %{HTTP_HOST} 是指取得用户訪问的URL的主域名  然后空格后面是一个正則表達式匹配,意识就是说是否是 nbphp.com 。

    假设用户訪问使用的URL满足全部列出的RewriteCond 提出的条件,那么进行下一步RewriteRule 即開始进行引导,这才開始实现.htaccess文件的重要功能。

    相同。前面是正則表達式,用户分析用户的除了主域名nbphp.com之外的URL ,^(.*)$的意思就是全部的内容。 然后空格后面写的是我们引导用户訪问的文件夹。我们带着他走到新的一个域名上。$1 指的是前面括号中匹配url所得到的内容。

    这样就是一个完整的小样例。关于RewriteCond里 怎样调用url的某个部分。我们能够參考这篇文章(Apache的Mod_rewrite学习 (RewriteCond重写规则的条件);

    3、现学现用,学习正則表達式。

    推荐一个经典的教程: 正則表達式30分钟新手教程

    这个教程的确非常easy。看完基本上写一些简单的正则就没有问题了。正则是一个须要长期使用的工具,隔段时间不用会忘记。所以我每次都看一遍这个教程。

    事实上学过之后重要的就是一点内容。

    我简单罗列了例如以下:

    .  换行符以外的全部字符

    w匹配字母或数字或下划线或汉字

    s匹配随意的空白符

    d匹配数字

    匹配单词的開始或结束

    ^匹配字符串的開始

    $匹配字符串的结束

    *反复零次或很多其它次

    *反复零次或很多其它次

    +反复一次或很多其它次

    ?反复零次或一次

    {n}反复n次

    {n,}反复n次或很多其它次

    {n,m}反复n到m次

    应用替换时,前面第一个()中匹配的内容后面就用$1引用,第二个()中匹配的就用$2应用……

    推荐一个有用的正则在线測试站点 http://www.regextester.com/

    我们来分析一下 discuz7.0 搜索引擎优化 htaccess 里面的重写。

    RewriteRule ^forum-([0-9]+)-([0-9]+).html$  forumdisplay.php?fid=$1&page=$2

    首先增加用户通过 nbphp.com/forum-2-3.html 訪问discuz论坛,那么先通过.htaccess过滤,看看是否须要.htaccess引导一下用户,假设满足列出的一系列RewriteCond的条件那么就进行重写。discuz的没有列出RewriteCond 所以应该所有都进行重写。

    所以開始进行转写,forum-2-3.html 这个正好符合 列出的^forum-([0-9]+)-([0-9]+).html$ 正則表達式。而且 $1 为 2  ,$2为3 ,所以代入后面,即 forumdisplay.php?fid=2&page=3 加上前面的RewriteBase 指定的文件文件夹,那么就带他到制定文件夹的forumdisplay.php?

    fid=2&page=3 。

    4、常见的.htaccess应用举例(部分样例引自四个样例实战解说.htaccess文件rewrite规则)
    4.1防止盗链,假设来得要訪问jpe jpg bmp png结尾的url 用户不是来自我们的站点。那么让他看一张我们站点的展示图片。

    RewriteEngine On

    RewriteCond %{HTTP_REFERER} !^http://(.+.)?mysite.com/ [NC]

    RewriteCond %{HTTP_REFERER} !^$

    RewriteRule .*.(jpe?g|gif|bmp|png)$ /images/nohotlink.jpg [L]

    4.2 站点升级的时候,仅仅有特定IP才干訪问,其它的用户将看到一个升级页面

    RewriteEngine on

    RewriteCond %{REQUEST_URI} !/upgrade.html$

    RewriteCond %{REMOTE_HOST} !^24.121.202.30

    RewriteRule $ http://www.nbphp.com/upgrade.html [R=302,L]

    4.3把老的域名转向新域名

    # redirect from old domain to new domain

    RewriteEngine On

    RewriteRule ^(.*)$http://www.yourdomain.com/$1[R=301,L]

    5、一些其它功能
    5.1 引出错误文档的文件夹

    ErrorDocument 400 /errors/badrequest.html

    ErrorDocument 404   http://yoursite/errors/notfound.html

    ErrorDocument 401 “Authorization Required

    5.2 Blocking users by IP 依据IP阻止用户訪问

    order allow,deny

    deny from 123.45.6.7

    deny from 12.34.5. (整个C类地址)

    allow from all

    5.3 防止文件夹浏览

    # disable directory browsing

    Options All -Indexes

    5.4设置默认首页

    # serve alternate default index page

    DirectoryIndex about.html

    5.5 把一些老的链接转到新的链接上——搜索引擎优化SEO

    Redirect 301 /d/file.htmlhttp://www.htaccesselite.com/r/file.html

    5.6为server管理员设置电子邮件。

    ServerSignature EMail

    SetEnv SERVER_ADMINdefault@domain.com

    本文章主要介绍了应用最广最有用的重写功能,记住.htaccess的权限要设置成644

    原文链接: .htaccess具体解释及.htaccess參数说明

    ©本文由 吕 收集整理。引用内容如有犯权请留言,转载请注明原文链接

  • 相关阅读:
    canvas
    学习总结
    后台管理人员项目,添加和查询的思路
    写了项目的一些心得
    学了一丢丢的正则皮毛
    已学的前端存储(学生)
    $.ajax()方法详解即自己遇到问题(新手)
    C#中 decimal 的四舍五入
    自己写一个C#数据结构:用List<T>实现一个简单的Stack
    【转】在CentOS 6.X上部署C# 开发环境
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/7067391.html
Copyright © 2020-2023  润新知