.htaccess的使用

         先给大家说一下.htaccess的作用,Apache系统中的.htaccess文件(或者"分布式配置文件"提供了针对目录改变配置的方法.即,在一个特定的文档目录中放置一个包含一个或多个指令的文件,以作用于此目录及其所有子目录.作为用户,所能使用的命令受到限制.子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令,.htaccess必须以ASCII模式上传,最好将其权限设置为644.

        在给出如何配置Apache支持.htaccess文件之前,首先申明一下:使用.htaccess文件,会降低httpd服务器的一点性能.一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限.有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样.把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法..htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下.如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下.虽然如此,一般都应该尽可能地避免使用.htaccess文件.任何希望放在.htaccess文件中的配置,都可以放在主配置文件的段中,而且更高效.

       避免使用.htaccess文件有两个主要原因:首先是性能.如果AllowOverride启用了.htaccess文件,则Apache需要在每个目录中查找.htaccess文件.因此,无论是否真正用到,启用.htaccess都会导致性能的下降.另外,对每一个请求,都需要读取一次.htaccess文件.

      还有,Apache必须在所有上级的目录中查找.htaccess文件,以使所有有效的指令都起作用,所以,如果请求/2013/10/1中的页面,Apache必须查找以下文件:

/.htaccess 
/2013/.htaccess 
/2013/10/.htaccess 
/2013/10/1/.htaccess

        一共就要访问4个额外的文件,就算这些文件都不存在,这也是本文开始说会影响服务器的一点性能的原因.

        其次是安全.这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权.

        Apache如何开启.htaccess?其实只要简单修改一下Apache的httpd.conf文件就可以让Apache启用.htaccess,将httpd.conf打开后,将你要启用.htaccess的主机下找到

AllowOverride None

        把它修改为

AllowOverride All

        通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的.

        如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变.例如,需要使用.config,则可以在httpd.conf文件中按以下方法配置:

AccessFileName .config

       .htaccess的使用方法有很多,大部分都在下面给出来了,大家可以看看:

1.定制目录的默认页面

#设置首页文件顺序为index.html,index.php,index.htm
DirectoryIndex index.html index.php index.htm

        你可以使用上面的配置来更改目录的默认页面,例如你将这个脚本放在 /blog 目录,则用户请求 /blog/ 时候就会访问 /blog/index.html.你还可以定制个性化的默认页面:

#定义xu文件为text/html类型
AddType text/html xu
#定义kang.xu文件为目录首页
DirectoryIndex kang.xu

2.自定义错误页

#设置404页面为errors目录下的404.html文件
ErrorDocument 404 errors/404.html
#设置500页面为errors目录下的500.html文件
ErrorDocument 500 errors/500.html

        当用户访问页面报错时,例如页面找不到你希望显示自定义的错误页面,你可以通过这种方法来实现.或者是动态的页面:

#你可以将/psych/cgi-bin/error/error?404更改为其他动态页面
ErrorDocument 404 /psych/cgi-bin/error/error?404
#你可以将/psych/cgi-bin/error/error?500更改为其他动态页面
ErrorDocument 404 /psych/cgi-bin/error/error?500

        如果你想只输出一行文字的话,你可以这样:

#你可以将 404,找不到页面 改为你想要输入的文字
ErrorDocument 404 "404,找不到页面"
ErrorDocument 500 "500,服务器内部错误"

3.访问控制

        .htaccess经常用来限制和拒绝访问某个文件和目录,例如我们有一个文件夹,这里存放一些脚本,我们不希望用户直接访问这个文件夹,那么通过下面的脚本可以实现:

#禁止所有访问
Deny from All

        上述脚本是拒绝所有的访问,你也可以根据IP段来拒绝:

#先禁止,后允许
Order Deny,Allow
#禁止所有
Deny from All
#允许来自192.168.0.1-192.168.0.255的访问,这是局域网的ip段
Allow from 192.168.0.0/24

        一般这些方法是通过防火墙来处理,但在一个生产环境中的服务器来说,这样的调整非常方便.有时候你只是想禁止某个ip访问:

#先允许,后禁止
Order Allow,Deny
#禁止来自83.222.23.219的访问
Deny from 83.222.23.219
#允许所有访问
Allow from All

        如果你想禁止一个文件拒绝访问,你可以这样:

<Files ~ "^.(htaccess|htpasswd)$">
Deny from All
</Files>

4.修改环境变量

        环境变量包含了服务器端CGI的一些扩展信息,可使用SetEnv和UnSetEnv进行设置以及取消设置.

#设置管理员的名字
SetEnv SITE_WEBMASTER "KangXu"
#设置管理员的联系方式,一般是带着邮件地址的链接
SetEnv SITE_WEBMASTER_URI mailto:mzthn@foxmail.com
#取消设置,将REMOTE_ADDR改为你想要取消的环境变量
UnSetEnv REMOTE_ADDR

5.301 重定向

        如果你想将不带www跳转到带www:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(wxukang\.cn)(:80)? [NC]
RewriteRule ^(.*) http://www.wxukang.cn/$1 [R=301,L]
<IfModule>

        如果你想将带www跳转到不带www:

<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www\.wxukang\.cn)(:80)? [NC]
RewriteRule ^(.*) http://wxukang.cn/$1 [R=301,L]
<IfModule>

        如果你希望某个页面跳转到新的页面:

Redirect 301 /text/file.html http://my.wxukang.cn/new/file.html

        下面可以实现对整个路径的重定向:

RedirectMatch 301 /blog(.*) http://www.wxukang.cn/$1

6.使用.htaccess实现缓存

        通过设置在浏览器上缓存静态文件可以提升网站的性能:

#缓存ico,pdf,flv,jpg,jpeg,png,gif,swf,mp3,mp4一年
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|swf|mp3|mp4)$">
Header set Cache-Control "public"
Header set Expires "Tue, 01 Oct 2013 10:20:00 GMT"
Header unset Last-Modified </FilesMatch> #缓存html,htm,xml,txt,xsl两个小时 <FilesMatch "\.(html|htm|xml|txt|xsl)$"> Header set Cache-Control "max-age=7200, must-revalidate" </FilesMatch> #压缩并缓存js,css两个小时 <FilesMatch "\.(js|css)$"> SetOutputFilter DEFLATE Header set Expires "Tue, 01 Oct 2013 10:20:00 GMT" Header set Cache-Control "max-age=7200, must-revalidate" </FilesMatch>

7.使用GZIP对输出进行压缩

        在.htaccess中添加下面的代码可以将所有的css,js和html使用GZIP算法压缩:

<IfModule mod_gzip.c>
    mod_gzip_on       Yes
    mod_gzip_dechunk  Yes
    mod_gzip_item_include file      \.(html?|txt|css|js|php|pl)$
    mod_gzip_item_include handler   ^cgi-script$
    mod_gzip_item_include mime      ^text/.*
    mod_gzip_item_include mime      ^application/x-javascript.*
    mod_gzip_item_exclude mime      ^image/.*
    mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
</IfModule>

        使用上面代码的前提是启用mod_gzip模块,你可以使用下面脚本来判断Apache服务器是否提供mod_deflate支持:

<Location>
    SetOutputFilter DEFLATE
    SetEnvIfNoCase Request_URI  \
        \.(?:gif|jpe?g|png)$ no-gzip dont-vary
    SetEnvIfNoCase Request_URI  \
        \.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary
</Location>

        如果Apache服务器不支持mod_deflate,那么可使用下面方法:

<FilesMatch "\.(txt|html|htm|php)">
     php_value output_handler ob_gzhandler
</FilesMatch>

8.强制使用HTTPS访问

        通过以下脚本可以强制整个网站必须使用https方式访问:

RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

9.URL重写

        例如要将page.php?id=12 重写为page-12.html

RewriteEngine on
RewriteRule ^page-([0-9]+)\.html$ page.php?id=$1

        将page.php?id=12重写为page/ipod-nano/12.html

RewriteEngine on
RewriteRule ^page/([a-zA-Z0-9_-]+)/([0-9]+)\.html$ page.php?id=$2

        重写 wxukang.cn/user.php?username=xyz到wxukang.cn/xyz

RewriteEngine On
RewriteRule ^([a-zA-Z0-9_-]+)$ user.php?username=$1
RewriteRule ^([a-zA-Z0-9_-]+)/$ user.php?username=$1

        重定向某个域名到网站目录下的blog文件夹:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^test\.com$ [OR]
RewriteCond %{HTTP_HOST} ^www\.test\.com$
RewriteCond %{REQUEST_URI} !^/blog/
RewriteRule (.*) /blog/$1

10.阻止列出目录文件

        使用下面代码可以防止没有默页面列出目录里的所有文件:

Options -Indexes

        或者

IndexIgnore *

11.添加新的MIME-Types

        MIME-types依赖于文件的扩展名,未能被识别的文件扩展名会当成文本数据传输,添加MIME-Types后,还可以屏蔽下载对话框.

AddType application/x-endnote-connection enz
AddType application/x-endnote-filter enf
AddType application/x-spss-savefile sav

12.防盗链

        你不希望别人网站引用你站内的图片,css等静态文件,也就是传说中的防盗链,可以使用如下脚本:

RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://www.wxukang.cn.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.wxukang.cn$ [NC]
RewriteRule \.(ico|pdf|flv|jpg|jpeg|mp3|mpg|mp4|mov|wav|wmv|png|gif|swf|css|js)$ - [F,NS,L]

13.指定上传文件的大小限制,适用于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

        上述脚本中,通过四个参数来设置上传文件的限制,第一个参数是文件的大小,第二个是 POST 数据的大小,第三个是传输的时间(单位秒),最后一个是解析上传数据最多花费的时间(单位秒).

14. 禁止脚本执行

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

15. 修改字符集和语言头

AddDefaultCharset UTF-8
DefaultLanguage zh-CN

16. 设置服务器时区(GMT)

SetEnv TZ Asia/BeiJing

17. 强制“保存文件”提示

AddType application/octet-stream .avi .mpg .mov .pdf .xls .mp4

18.保护单个文件

        正常情况下.htaccess可用于限制整个目录的访问,但也可以只限制某个文件:

<Files kangxu.html>
Order Deny,Allow
Deny from All
AuthType Basic
AuthName "Characterology Student Authcate"
AuthLDAP on
AuthLDAPServer ldap://directory.characterology.com/
AuthLDAPBase "ou=Student, o=Characterology University, c=au"
require valid-user
satisfy any
</Files>

        将以下配置放到要保护目录下就可以保护目录:

Order Deny,Allow
Deny from All
AuthType Basic
AuthName "Characterology Student Authcate"
AuthLDAP on
AuthLDAPServer ldap://directory.characterology.com/
AuthLDAPBase "ou=Student, o=Characterology University, c=au"
require valid-user
satisfy any

        以上两处配置都必须要证书服务器,.htpasswd配置方法如下:

AuthUserFile ".htpasswd的路径"
AuthType Basic
AuthName "Please Type Your Username And Password"
require valid-user

       .htpasswd文件的内容:

kangxu:Basic加密的编码

19.设置Cookie

        通过环境变量来设置Cookie

Header set Set-Cookie "language=%{lang}e; path=/;" env=lang

        基于请求设置Cookie,该代码发送 Set-Cookie头用于设置Cookie值为第二个括号里的匹配项

 RewriteEngine On
 RewriteBase /
 RewriteRule ^(.*)(de|es|fr|it|ja|ru|en)/$ - [co=lang:$2:.wxukang.cn:7200:/]

20.自定义头部

#设置P3P
Header set P3P "policyref=\"http://www.askapache.com/w3c/p3p.xml\""
#设置Pingback
Header set X-Pingback "http://www.wxukang.cn/action/xmlrpc"
#设置页面的语言代码
Header set Content-Language "zh-CN"
#声明支持Accept-Encoding
Header set Vary "Accept-Encoding"

21.根据User-Agent来阻止请求

        这个方法可以通过阻止某些机器人或蜘蛛爬虫抓取你的网站来节省你的带宽流量。

SetEnvIfNoCase ^User-Agent$ .*(craftbot|download|extract|stripper|sucker|ninja|clshttp|webspider|leacher|collector|grabber|webpictures) HTTP_SAFE_BADBOT
SetEnvIfNoCase ^User-Agent$ .*(libwww-perl|aesop_com_spiderman) HTTP_SAFE_BADBOT
Deny from env=HTTP_SAFE_BADBOT

22.去部分免费虚拟主机的广告

#去掉所有php文件的广告
LayoutIgnoreURI *.php
#去掉所有cgi文件的广告
LayoutIgnoreURI *.cgi
#去掉所有htm文件的广告
LayoutIgnoreURI *.htm
#去掉所有html文件的广告
LayoutIgnoreURI *.html

23.静态化

       Typecho:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

       Wordpress:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

24.防止黑客入侵,提高网站安全

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

<IfModule mod_rewrite.c>
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]
</IfModule>

25.通过引用信息来阻止来自某些网站的浏览者

# 阻止来自某网站的用户
<IfModule mod_rewrite.c>
RewriteEngine on
#下面为要阻止网站的网址
RewriteCond %{HTTP_REFERER} scumbag.com [NC,OR]
RewriteCond %{HTTP_REFERER} wormhole.com [NC,OR]
RewriteRule .* - [F]
</ifModule>

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

        在你的目录里放下加入以下脚本的.htaccess,可以禁止脚本执行

# 禁止某些目录里的脚本执行权限
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI 

27.定义php.ini的路径

        有时你需要修该php.ini文件,但主机商禁止修改你可已使用以下代码启用php.ini

suPHP_ConfigPath /home/xxx/public_html