apache .htaccess 分布式配置文件 解读

Posted PHP2成长之路

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了apache .htaccess 分布式配置文件 解读相关的知识,希望对你有一定的参考价值。

一、.htaccess的基本作用


.htaccess是一个纯文本文件,它里面存放着Apache服务器配置相关的指令。

.htaccess主要的作用有:

URL重写、

自定义错误页面、

MIME类型配置以及访问权限控制等。


.htaccess主要体现在:

伪静态的应用、

图片防盗链、

自定义404错误页面、

阻止/允许特定IP/IP段、

目录浏览与主页、

禁止访问指定文件类型、

文件密码保护等。

.htaccess的用途范围主要针对当前目录。



二、启用.htaccess的配置

(1)启用.htaccess,需要修改httpd.conf,启用AllowOverride,并可以用AllowOverride限制特定命令的使用。

打开httpd.conf文件用文本编辑器打开后,查找 

复制代码代码如下:


<Directory />

Options FollowSymLinks

AllowOverride None

</Directory>

改为:

<Directory />

Options FollowSymLinks

AllowOverride All

</Directory>



(2)去掉下面的注释 

LoadModule rewrite_module modules/mod_rewrite.so 



(3)修改.htaccess 文件名 为其他文件名

如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。

例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:

复制代码代码如下:

AccessFileName .config



三、.htaccess访问控制


1、访问控制基础:Order命令


为了限制用户访问一些关键目录,通常加入.htaccess文件,常见的写法如下:

复制代码代码如下:


<Files  ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])">

 Order allow,deny

 Deny from all

</Files>


 


说明:


(1)Files后的波浪线表示启用“正则表达式”,简单的写法有:<Files *>。


(2)Order命令:通过Allow,Deny参数,Apache首先找到并应用Allow命令,然后应用Deny命令,以阻止所有访问,也可以使用Deny,Allow。


四、URL重写


下面是一段简单的URL重写规则示例:

复制代码代码如下:


# 将 RewriteEngine 模式打开 

RewriteEngine On 

# Rewrite 系统规则请勿修改 

RewriteRule ^p/([0-9]+)\.html$ index.php?post_id=$1

RewriteRule ^u-(username|uid)-(.+)\.html$ space.php?$1=$2



其中,RewriteEngine 表示开启URL重写,RewriteRule是重写规则。



五、重写规则:

【RewriteRule语法:】


RewriteRule Pattern Substitution [flags]


【flags】


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


此标记使当前规则与下一个规则相链接。它产生这样的效果:如果一个规则被匹配,则继续处理其后继规则,也就是这个标记不起作用;如果该规则不被匹配,则其后继规则将被跳过。比如,在一个目录级规则中执行一个外部重定向时,你可能需要删除”.www”(此处不应该出现”.www”)。


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


在客户端设置一个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开头),否则将得到一个代理模块返回的错误。使用这个标记,可以把某些远程成分映射到本地服务器域名空间,从而增强了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反馈给客户端,如将”/~”重写为”/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]




六、配置错误页面


基本语法如下:

复制代码代码如下:


# custom error documents

ErrorDocument 401 /err/401.php

ErrorDocument 403 /err/403.php

ErrorDocument 404 /err/404.php

ErrorDocument 500 /err/500.php


 


七、htaccess常用命令和配置技巧

1.禁止显示目录列表

为避免这种情况(而不必创建一堆的新index文件),你可以在你的.htaccess文档中键入以下命令,用以阻止

目录列表的显示:

复制代码代码如下:

Options -Indexes



复制代码代码如下:

deny from 000.000.000.000



复制代码代码如下:

allow from 000.000.000.000



如果你想阻止所有人访问该目录,则可以使用:

复制代码代码如下:

deny from all



不过这并不影响脚本程序使用这个目录下的文档。

3.替换index文件

也许你不想一直使用index.htm或index.html作为目录的索引文件。举例来说,如果你的站点使用PHP文件,你可能会想使用 index.php来作为该目录的索引文档。当然也不必局限于“index”文档,如果你愿意,使用.htaccess你甚至能够设置 foofoo.balh来作为你的索引文档!

这些互为替换的索引文件可以排成一个列表,服务器会从左至右进行寻找,检查哪个文档在真实的目录中存在。如果一个也找不到,它将会把目录列表显示出来(除非你已经关闭了显示目录文件列表)。

复制代码代码如下:

DirectoryIndex index.php index.php3 messagebrd.pl index.html index.htm



4.重定向(rewrite)

复制代码代码如下:

Redirect /location/from/root/file.ext http:///new/file/location.xyz



上述例子中,访问在root目录下的名为oldfile.html可以键入:

复制代码代码如下:

/oldfile.html



访问一个旧次级目录中的文件可以键入:

复制代码代码如下:

/old/oldfile.html



你也可以使用.htaccess重定向整个网站的目录。假如你的网站上有一个名为olddirectory的目录,并且你已经在一个新网站http: ///newdirectory/上建立了与上相同的文档,你可以将旧目录下所有的文件做一次重定向而不必一一声明:

复制代码代码如下:

Redirect /olddirectory http: ///newdirectory



这样,任何指向到站点中/olddirectory目录的请求都将被重新指向新的站点,包括附加的额外URL信息。例如有人键入:

复制代码代码如下:

http: ///olddirecotry/oldfiles/images/image.gif



请求将被重定向到:

复制代码代码如下:

http: ///newdirectory/oldfiles/images/image.gif



如果正确使用,此功能将极其强大。


 


八、安全配置

下面的htaccess代码能够提高你的web服务器的安全水平。图片链接盗用保护非常有用,它能防止其他人偷盗使用你的服务器上的图片资源。

1. 通过.htaccess放盗链

痛恨那些偷盗链接你的web服务器上的图片资源而耗尽了你的带宽的行为吗?试试这个,你可以防止这种事情的发生。

复制代码代码如下:

RewriteBase /  

RewriteCond %{HTTP_REFERER} !^$  

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

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



2. 防黑客

如果你想提高网站的安全等级,你可以去掉下面的几行代码,这样可以防止一些常见恶意URL匹配的黑客攻击技术。

复制代码代码如下:

RewriteEngine On  


# proc/self/environ? 没门!  

RewriteCond %{QUERY_STRING} proc/self/environ [OR]  


# 阻止脚本企图通过URL修改mosConfig值  

RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|%3D) [OR]  


# 阻止脚本通过URL传递的base64_encode垃圾信息  

RewriteCond %{QUERY_STRING} base64_encode.*(.*) [OR]  


# 阻止在URL含有<script>标记的脚本  

RewriteCond %{QUERY_STRING} (<|%3C).*script.*(>|%3E) [NC,OR]  


# 阻止企图通过URL设置PHP的GLOBALS变量的脚本  

RewriteCond %{QUERY_STRING} GLOBALS(=|[|%[0-9A-Z]{0,2}) [OR]  


# 阻止企图通过URL设置PHP的_REQUEST变量的脚本  

RewriteCond %{QUERY_STRING} _REQUEST(=|[|%[0-9A-Z]{0,2})  


# 把所有被阻止的请求转向到403禁止提示页面!  

RewriteRule ^(.*)$ index.php [F,L] 



3. 阻止访问你的 .htaccess 文件或者指定类型的文件

下面的代码可以阻止别人访问你的.htaccess文件。同样,你也可以设定阻止多种文件类型。

# 保护你的 htaccess 文件  

<Files .htaccess>  

order allow,deny  

deny from all  

</Files>  


# 阻止查看指定的文件  

<Files secretfile.jpg>  

order allow,deny  

deny from all  

</Files>  


# 多种文件类型  

<FilesMatch “.(htaccess|htpasswd|ini|phps|fla|psd|log|sh)$”>  

 Order Allow,Deny  

Deny from all  

</FilesMatch>[/code] 

4.禁止脚本执行,加强你的目录安全

复制代码代码如下:

# 禁止某些目录里的脚本执行权限  

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi  

Options -ExecCGI


 



九、一些常用的设置

1.时区设置

有些时候,当你在PHP里使用date或mktime函数时,由于时区的不同,它会显示出一些很奇怪的信息。下面是解决这个问题的方法之一。就是设置你的服务器的时区。你可以在这里找到所有支持的时区的清单。

1.SetEnv TZ Australia/Melbourne 

2. seo/seo.html" target="_blank">搜索引擎友好的301永久转向方法

为什么这是搜索引擎友好的呢?因为现在很多现代的搜索引擎都有能根据检查301永久转向来更新它现有的记录的功能。

复制代码代码如下:

Redirect 301 http://www.aqee.net/home http://www.aqee.net/ 



3. 屏蔽下载对话框

通常,当你下载东西的时候,你会看到一个对话框询问你是保持这个文件还是直接打开它。如果你不想看到这个东西,你可以把下面的一段代码放到你的.htaccess文件里。

复制代码代码如下:

AddType application/octet-stream .pdf  

AddType application/octet-stream .zip  

AddType application/octet-stream .mov 



4. 省去www前缀

SEO的一个原则是,确保你的网站只有一个URL。因此,你需要把所有的通过www的访问转向的非www,或者反这来。

复制代码代码如下:

RewriteEngine On  

RewriteBase /  

RewriteCond %{HTTP_HOST} ^www.aqee.net [NC]  

RewriteRule ^(.*)$ http://aqee.net/$1 [L,R=301]



5. 个性化Error页面

对每个错误代码定制自己个性化的错误页面。

复制代码代码如下:

ErrorDocument 401 /error/401.php  

ErrorDocument 403 /error/403.php  

ErrorDocument 404 /error/404.php  

ErrorDocument 500 /error/500.php



6. 压缩文件

通过压缩你的文件体积来优化网站的访问速度。

复制代码代码如下:

# 压缩 text, html, javascript, css, xml:  

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 



7. 缓存文件

缓存文件是另外一个提高你的网站访问速度的好方法。

复制代码代码如下:

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

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

</FilesMatch> 



8. 对某些文件类型禁止使用缓存

而另一方面,你也可以定制对某些文件类型禁止使用缓存。

复制代码代码如下:

# 显式的规定对脚本和其它动态文件禁止使用缓存  

<FilesMatch “.(pl|php|cgi|spl|scgi|fcgi)$”>  

Header unset Cache-Control  

</FilesMatch> 




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

 

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 错误页面


当用户访问了一个不存在的页面的时候,网页服务器会显示“404 file not found”错误。有很多CMS可以让你设置自定义的错误页面,但最简单的方法是更改htaccess:


ErrorDocument 404 /404.html


5. 设置目录的默认页面


假如你需要为不同的目录设置不同的默认页面,你可以很容易的通过 .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上传文件大小


这招在共享空间的服务器上很有用,可以让我的用户上传更大的文件。第一个是设置最大的上传文件大小,第二个是设置最大的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>


以上是关于apache .htaccess 分布式配置文件 解读的主要内容,如果未能解决你的问题,请参考以下文章

apache的重写规则

.htaccess 详解

网站之.htaccess文件

htaccess编写规则

.htaccess是什么

ctfhub技能树—文件上传—.htaccess