Apache配置 之 .htaccess 文件(一)

原创
2014/09/28 09:41
阅读数 355

1、htaccess是什么

    htaccess是hypertext access的缩写。.htaccess文件是一个被多个Web服务器(包括Apache)所支持的目录级配置文件。

所以,要使用本文中所叙述的功能,首先你得有一个服务器(Apache)!


2、在Apache中支持.htaccess文件配置

    在Apache中要支持.htaccess文件,要在站点目录配置中设置参数AllowOverride 为all(如果只需要对.htaccess中的部分功能可以设置为其他参数,点击这里打开AllowOverride参考)。

<Directory ...>
...
       AllowOverride all

...
</Directory>

    另外.htaccess文件的名字也可以自定义,例如如果我们要定义为.acl来替代.htaccess这个名字,但是建议使用“ht”开头,因为Apache默认对".ht"开头的文件采取了保护,不允许外部读取。

配置如下:

AccessFileName .acl

点击这里打开AccessFileName参考


3、创建.htaccess文件

    创建.htaccess文件很简单,直接用文本编辑器新建即可,如果你是在windows环境下新建的话,建议使用第三方的文本编辑器,例如note plus plus会节省很多不必要的麻烦。(编码兼容问题)


4、自定义Http状态码对应的页面(404错误页面)

    当用户发起一个非法的URL请求时候,能够友好的返回一个错误提示页面是非常重要的。

    例如当用户输入一个http://caigesb/xiaozhi.html的时候,服务器并没有xiaozhi.html这个文件,或者无法解 析这个路径的时候,就会返回一个错误代码,404。默认情况下浏览器接受到错误代码404后会有一片空白,或者友好一点的浏览器会显示一个默认的错误页面提示这个路径找不到,甚至国内一些浏览器会乘机嵌入广 告。现在,我们要避免这种情况,当这个路径找不到的时候,跳到一个自定义友好的界面来提示用户。

这时,我们需要在.htaccess文件中加入一下配置命令:

ErrorDocument 404 /error_pages/404.html

保存文件即可。点击这里查看优秀404例子

当然,你也可以为其他的错误代码设置不同的提示页面,例如401提示未授权,403提示禁止访问,具体点击这里查阅Http状态码及其含义


5、重定向

利用重定向功能可以把用户对某个URL的请求重定向到另外一个URL,注意,浏览器的URL会改变!

例如:由于我的站点域名临时改变了,但是我不想通知所有的用户去反问新的域名,即我要把URL: http://caigesb 重定向到 http://xiaozhi 需要在.htaccess文件中加入一下配置:

Redirect / http://cn.bing.com


6、密码保护

启用密码保护功能可以给指定的目录设置访问权限。

在.htaccess中加入以下代码

AuthType Basic
AuthName "Password Required"
AuthUserFile /Users/Caige/***/passwords/passwords.file
Require user caige

解释:

AuthType Basic 设置加密类型

AuthName 描述信息,给用户查看的提示

AuthUserFile 设置密码文件路径,注意这里是物理路径

Require user 设置哪些用户可以登录

对于生成passwords.file文件,要使用apache提供的命令htpasswd。期间会要求输入两次密码。

笔者在Mac上的命令如下:

Michaels-MacBook-Pro:~ Caige$ htpasswd -c /Users/Caige/***/passwords/passwords.file caigeNew password: Re-type new password: Adding password for user caige

添加成功后,将会在指定目录生成密码文件passwords.file

        用文本编辑器打开passwords.file文件会发现以下内容。里面包含了用户名和密码信息,这里的密码信息是经 过加密算法加密的。对于不同的平台会默认算法会不同。也可以在产生密码的时候通过参数来设置。

caige:$apr1$dneOMY5I$1g1H9IAPFH4B5GA9DrRRU0

以上例子是单用户的验证,多用户的验证以及自定义加密方式请点击这里查看更多

7、地址过滤

对于某些路径,例如后台管理等路径,常常会设置为指定ip才能访问,这样对站点的安全起到一定的作用。

设置代码如下:

order allow,deny
allow from 192.168.
allow from *.caige.cn
deny fromfont all

解释:

order allow,deny 设置allow命令和deny命令的优先级。如果按照当前的优先级,当服务器接受到一个请 求的时候,服务器会先去查找allow命令,如果找到,那么就结束。否则找不到对应的allow命令,采取查找deny命令。

allow from 允许规则

deny from 禁止规则

综上所属,上面的配置允许当前目录只允许采用以ip为 192.168.*.或者域名为  *.caige.cn 的URL来请求才会 得到响应,否则会返回403禁止访问的提示。

点击这里查看详细设置


8、Rewrite(防盗链与禁止访问)

现在很多站点常常采用盗链的方式引用别的站点资源以便获取利益。这样对于被盗取一方不仅在服务器资源占 用上产生来影响,同时对其利益方面产生损坏。

下面以防止图片盗链为例讲解.htaccess的如果防止别的站点引用。

假如有站点A上盗用来B站点的图片资源

在A站点的页面上有如下代码:

<img src="http://www.B.com/img.jpg" />

当B站点不采取任何措施的情况下,A站点利用B站点的服务器资源来为自己的站点谋取利益。A站点发现后当 然很不爽。于是在.htaccess文件中加入以下代码

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !B.com [NC]
RewriteCond %{HTTP_REFERER} !baidu.com [NC]
RewriteRule .*\.(gif|jpg|png)$ http://webeta.cn/no.png [R,NC,L]

        解释:

我们主要是用了Apache的Rewrite功能,所以mod_rewrite模块的加载进来,具体在httpd.conf文件中配置。

加载模块的方法很多,可以直接修改httpd.conf文件。如果是采用其他的集成Apache的工具例如WAMP,可以直接在图形界面中加载。

Rewrite 语法:

      A、RewriteCond 命令的格式如下 RewriteCond 测试字符串 条件[标识]

        B、对于测试字符串允许引用变量:

         %{ 系统变量名字 表示获取系统变量,系统变量允许是Http请求头信息,有HTTP_REFERER、   HTTP_USER_AGENT等变量允许使用。

       对于条件部分是一个正则表达式的扩展,除了标准的正则语法外还有扩展语法,例如:

      ‘=’ (等于) 将条件部分当作一个普通字符串,将它和测试字符串进行比较,当测试字符串 与条件部分   完全相同时为真。

        -d’ (是否为目录) 将测试字符串当作一个目录名,检查它是否存在以及是否是一个目录。

      C、标识部分。多个标志之间用逗号分隔。默认情况下多个条件是AND的关系,如果需要修改为OR关系则在标识部分修改为 "[OR]"。另外常用的一个标识"[NC]"是英文nocase的缩写表示                                    不区分大小写。

RewriteEngine on

    表示开启Rewrite功能

 RewriteCond %{HTTP_REFERER} !^$ [NC]  

允许空“HTTP_REFERER”的访问,在HTPP头信息中Refferer一项允许为空。这样做允许用户在浏览器地址 栏中直接输入图片地址时以图片文件的显示。一般建议这样设置,否则用户在通过代理服务器访问的时候,由 于HTTP头信息不完整会导致访问问题。

  RewriteCond %{HTTP_REFERER} !B.com [NC]  

  设置为允许B站点自己可以访问。

 RewriteCond %{HTTP_REFERER} !baidu.com [NC]

允许搜索引擎收录引用。    

 RewriteRule %{HTTP_REFERER} http://www.B.com/unauthorized.jpg [R,NC,L]

  返回未授权的引用图片。后面参数R表示重定向,L表示last的意思,表示这次重定向到此结束。后续的规则不  再进行解析。

当然,B站点也可以直接返回一个403服务器不允许访问的错误,这样,盗用站点的图片就会变成一个红色的 交叉,或者空白。

返回403使用以下命令:

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

同理,可以防止其他资源被盗用,例如css文件,js文件,多媒体文件等。

不仅对文件可以禁止,文件目录也可以。

当我们php项目中有一个库目录 “/includes”。用户如果可以直接打开这个目录中的文件的话会得到一堆错误结果,我们不希望开放这个目录中的php文件给用户。

## 开启Rewrite引擎
RewriteEngine On 
RewriteBase / 
## 设置条件,这个正则的匹配包含 /include/ 的路径 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /includes/ .*$ [NC] 
## 测试是否是php后缀的文件
RewriteCond %{REQUEST_FILENAME} ^.+\.php$ 
## 设置禁止反问并结束本次Rewrite判断。
RewriteRule .* - [F,NS,L]



        点击查看关于Rewrite的更多设置


9、防御离线网页下载和非法网页爬虫

有些用户为了离线查看网站,例如小说网站等。用户会利用一些离线工具来抓去网页并离线到本地,以便用户 不方便上网的时候可以查看这些资源。虽然对用户来说这个体验不错,但是对站点来说会导致严重的性能以及 宽带损耗,影响其他用户的访问。另外,我们会很奇怪的发现收到各种垃圾邮件。他们是怎么或者我们的邮箱 地址的呢?其中一种方式便是通过非法的网页爬虫来抓取我们的网页,提取其中的邮箱地址。对于合法的网络 爬虫来说,他们一般尊重站点,站点可以通过设置自己的规则来决定是否暴露给爬虫。例如使用robot.txt来告 诉爬虫不希望这个站点被检索到。

对于以上的情况,我们可以通过Apache的Rewrite来进行防御。

代码如下:        

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR] 
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR] 
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR] 
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR] 
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR] 
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR] 
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR] 
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR] 
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR] 
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR] 
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR] 
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR] 
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR] 
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR] 
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR] 
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR] 
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR] 
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR] 
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR] 
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR] 
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR] 
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR] 
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR] 
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR] 
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR] 
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR] 
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR] 
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR] 
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR] 
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR] 
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR] 
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR] 
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR] 
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR] 
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR] 
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR] 
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR] 
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR] 
RewriteCond %{HTTP_USER_AGENT} ^Zeus 
RewriteRule ^.* - [F,L]


语法已经在上节解释过了,这里不再赘述。从上面的代码中我们可以知道,其实是利用HTTP头信息中的User Agent信息来进行防御的。User Agent是对浏览站点设备的描述,例如可以区别IOS和安卓设备。但是User  Agent是非常容易伪造的。所以,单恶意程序如果把User Agent伪装成合法的浏览设备(例如:chrome等)那么这里的规则也就失效了。


10、默认文档

假如我们的根目录对应的物理路径下有一个index.html的文件。然后我们在浏览器URL中输入http://caige.cn 的时候会显示出index.html的内容。这时候我们就说index.html为当前站点的默认文档。如果默认文档为其他文件的话,应在.htaccess文件中加入以下命令:

DirectoryIndex index.html index.aspx index.php

多个文档之间使用空格隔开,服务器会按照当前的顺序来一次寻找文档,如果找不到就返回错误。


11、增加MIME类型(强制浏览器下载多媒体文件)

MIME是(Multipurpose Internet Mail Extensions)的缩写。他是描述一个文件是什么或者描述什么类型的后缀名对应什么样类型的文件。

使用以下命令可以新增一个后缀名为html0的文件类型,他描述了html0为后缀的文件是text或者html文件。

AddType text/html htm0

当我们遇到mp3文件或者swf文件不能被浏览器播放的时候,可以使用以下配置:

AddType application/x-shockwave-flash swf

另外我们还可以强制浏览器打开某些文件的时候打开下载对话框。例如默认情况下,chrome打开图片会直接显示在浏览器上,我们可以使用以下配置把图片的MIME类型强制为application/octet-stream ,这样就可以强制浏览器下载图片文件而不是显示在浏览器上面。 对mp3、mp4等文件也可以做同样的处理。

AddType application/octet-stream jpg


12、开启SSI模块

    SSI是Server Side Includes 的缩写。他实质上是一组html标签,这些标签里面包含了一些命令去执行CGI脚本或者加载HTML内容。

    一个HTML页面通常由Header,Body等组成,而且Header里面有导航,如果我们每个页面都有包含了相同的代码,这样造成了代码的冗余。使用,SSI我们可以把相同的部分抽离出一个文件,然后用以下代码包含进来。

<!--#include virtual="/common/header.html"-->

    这样需要导航模块的html页面只要使用以上代码即可包含导航模块输出给浏览器。注意,这里的路径是相对路径。

    如果直接再html文件中加入以上代码,然后用浏览器浏览,你会发现完全没有效果。应为默认情况下,Apache并没有为我们开启SSI。在.htaccess中添加以下代码:

Options +Includes
AddHandler server-parsed .html

    要使用SSI还有一个前提,AllowOverride参数必须设置具有全县Options和FileInfo,具体设置方法参考第二节,或者直接把AllowOverride设置为All。

  解释:

    Options +Includes    告诉Apache服务器当前.htaccess文件设置的路径被允许使用SSI解析。

    AddHandler server-parsed .html    设置哪些后最的文件要使用SSI解析,一般情况下为了不混淆HMTL文档,会使用.shtml来提到.html

  另外SSI还可以使用系统变量,例如输出当前服务器时间。甚至,可以执行cmd和exe(在windows平台下)。具体点击这里查看SSI更多功能


13、允许CGI脚本在cgi-bin目录以外运行

    默认情况下Apache接收到cig执行命令的时候只会在cgi-bin目录下寻找要执行的脚本,我们可以使用以下命令来允许cgi脚本放在当前站点下:

AddHandler cgi-script .cgi
Options +ExecCGI


14、目录索引


    当用户一个发出一个请求http://caige.cn/index/的时候,默认情况下Apache会去站点目录./index下寻找默认文档(第10节)。如果找不到会返回一个服务器错误。但是有时候我们需要把当前目录index下的文件显示给用户,让用户去选择所需要的资源。这个时候我们就要开启目录索引功能告诉服务器开放当前目录index的文件列表给用户查看。但是,有时候又不想暴露出所有的文件,例如我想隐藏一些图片文件,那么可以使用以下配置:

    

Options +Indexes
IndexIgnore *.jpg *.gif

    解释:

    Options +Indexes 表示开启索引功能,这样Index文件夹下的文件将会在客户端被列出来

    IndexIgnore *.jpg *.gif 表示影藏所有的jpg和gif后缀的文件,也就是图片文件。

    另外,还可以在该目录下新建两种文本文件,一个命名为 HEADERREADME 。顾名思义,分别是头部描述文件和说明文件。注意这两个文本文件没有后缀名。

    用下图来说明本小节:

   


    我们可以看出Beauty.jpg被隐藏了,另外值得注意的是 HEADER 文件和 README 文件可以是html内容,也就是说,服务器会当他们为html文档来处理。其中 HEAEDER 的源码如下:

<h1>That's the Header file</h1>


    另外,Beauty.jpg仅仅是在目录里面被隐藏了,如果直接访问http://caige.cn/index/Beauty.jpg还是可以访问到图片资源的。


点击查看第二章《Apache配置 之 .htaccess 文件(二)》

原创内容,转载请注明出处:http://my.oschina.net/Caige


展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部