.htaccess实用指南
grick吧
全部回复
仅看楼主
level 6
grick 楼主
首先,来看看Apache手册中关于.htaccess的说明:工作原理和使用方法.htaccess文件(或者\\\"分布式配置文件\\\")提供了针对每个目录改变配置的方法,即在一个特定的目录中放置一个包含指令的文件,其中的指令作用于此目录及其所有子目录。说明:如果需要使用.htaccess以外的其他文件名,可以用AccessFileName指令来改变。例如,需要使用.config ,则可以在服务器配置文件中按以下方法配置:AccessFileName .config 通常,.htaccess文件使用的配置语法和主配置文件一样。AllowOverride指令按类别决定了.htaccess文件中哪些指令才是有效的。如果一个指令允许在.htaccess中使用,那么在本手册的说明中,此指令会有一个覆盖项段,其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。例如,本手册对AddDefaultCharset指令的阐述表明此指令可以用于.htaccess文件中(见\\\"作用域\\\"项),而覆盖项一行是FileInfo ,那么为了使.htaccess中的此指令有效,则至少要设置 AllowOverride FileInfo 。例子:作用域 server config, virtual host, directory, .htaccess 覆盖项 FileInfo 如果不能确定某个指令是否可以用于.htaccess文件,可以查阅手册中对指令的说明,看在\\\"作用域\\\"行中是否有\\\".htaccess\" 。(不)使用.htaccess文件的场合一般情况下,不应该使用.htaccess文件,除非你对主配置文件没有访问权限。有一种很常见的误解,认为用户认证只能通过.htaccess文件实现,其实并不是这样,把用户认证写在主配置文件中是完全可行的,而且是一种很好的方法。.htaccess文件应该被用在内容提供者需要针对特定目录改变服务器的配置而又没有root权限的情况下。如果服务器管理员不愿意频繁修改配置,则可以允许用户通过.htaccess文件自己修改配置,尤其是ISP在同一个机器上运行了多个用户站点,而又希望用户可以自己改变配置的情况下。虽然如此,一般都应该尽可能地避免使用.htaccess文件。任何希望放在.htaccess文件中的配置,都可以放在主配置文件的
段中,而且更高效。避免使用.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 ,虽然这种情况并不多。)其次是安全。这样会允许用户自己修改服务器的配置,这可能会导致某些意想不到的修改,所以请认真考虑是否应当给予用户这样的特权。但是,如果给予用户较少的特权而不能满足其需要,则会带来额外的技术支持请求,所以,必须明确地告诉用户已经给予他们的权限,说明AllowOverride设置的值,并引导他们参阅相应的说明,以免日后生出许多麻烦。注意,在/www/htdocs/example目录下的.htaccess文件中放置指令,与在主配置文件中
段中放置相同指令,是完全等效的。/www/htdocs/example目录下的.htaccess文件:/www/htdocs/example目录下的.htaccess文件的内容:AddType text/example .exm httpd.conf文件中摘录的内容:
AddType text/example .exm 但是,把配置放在主配置文件中更加高效,因为只需要在Apache启动时读取一次,而不是在每次文件被请求时都读取。
2007年11月12日 11点11分 1
level 6
grick 楼主
将AllowOverride设置为none可以完全禁止使用.htaccess文件:AllowOverride None 指令的生效.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有.htaccess文件,而指令是按查找顺序依次生效的,所以一个特定目录下的.htaccess文件中的指令可能会覆盖其上级目录中的.htaccess文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。例子:/www/htdocs/example1目录中的.htaccess文件有如下内容:Options +ExecCGI (注意:必须设置\\\"AllowOverride Options\"以允许在.htaccess中使用\\\"Options\"指令)/www/htdocs/example1/example2目录中的.htaccess文件有如下内容:Options Includes 由于第二个.htaccess文件的存在,/www/htdocs/example1/example2中的CGI执行是不允许的,而只允许 Options Includes ,它完全覆盖了之前的设置。将.htaccess合并到主配置文件中正如在配置段(容器)中讨论的那样,.htaccess文件能够覆盖
段中对相应目录的设置,但是也同样会被主配置文件中其它类型的配置段所覆盖。这个特性可以用来强制实施某些配置,甚至在AllowOverride已经许可的情况下。举个例子来说,为了强迫在.htaccess中禁止脚本执行但不限制其它的情况下,可以这样:
Allowoverride All
Options +IncludesNoExec -ExecCGI 认证举例如果你只是为了知道如何认证,而直接从这里开始看的,有很重要的一点需要注意,有一种常见的误解,认为实现密码认证必须要使用.htaccess文件,其实是不
正确的
。把认证指令放在主配置文件的
段中是一个更好的方法,而.htaccess文件应该仅仅用于无权访问主配置文件的时候。参见上述关于何时应该与何时不应该使用.htaccess文件的讨论。有此声明在先,如果你仍然需要使用.htaccess文件,请继续看以下说明。.htaccess文件的内容:AuthType BasicAuthName \"Password Required\"AuthUserFile /www/passwords/password.fileAuthGroupFile /www/passwords/group.fileRequire Group admins 必须设置 AllowOverride AuthConfig 以允许这些指令生效。更详细的说明,请参见认证、授权、访问控制。服务器端包含(SSI)举例.htaccess文件的另一个常见用途是允许一个特定的目录使用服务器端包含(SSI),可以在需要的目录中放置.htaccess文件,并作如下配置:Options +IncludesAddType text/html shtmlAddHandler server-parsed shtml 注意,必须同时设置 AllowOverride Options 和 AllowOverride FileInfo 以使这些指令生效。更详细的有关服务器端包含的说明,请参见SSI指南。CGI举例可以通过.htaccess文件允许在特定的目录中执行CGI程序,需要作如下配置:Options +ExecCGIAddHandler cgi-script cgi pl 另外,如下配置可以使给定目录下的所有文件被视为CGI程序:Options +ExecCGISetHandler cgi-script 注意,必须同时设置 AllowOverride Options 和 AllowOverride FileInfo 以使这些指令生效。更详细的有关CGI编程和配置的说明,请参见CGI指南。疑难解答如果在.htaccess文件中的某些指令不起作用,可能有多种原因。最常见的原因是AllowOverride指令没有被正确设置,必须确保没有对此文件区域设置 AllowOverride None 。有一个很好的测试方法,就是在.htaccess文件随便增加点无意义的垃圾内容,如果服务器没有返回了一个错误消息,那么几乎可以断定设置了 AllowOverride None 。在访问文档时,如果收到服务器的出错消息,应该检查Apache的错误日志,可以知道.htaccess文件中哪些指令是不允许使用的,也可能会发现需要纠正的语法错误。
2007年11月12日 11点11分 2
level 6
grick 楼主
下面是一些实用方法.htaccess可以做大量范围的事情,包括:文件夹密码保护、用户自动重新指向、自定义错误页面、变更你的文件扩展名、屏蔽特定的用户IP地址、只允许特定的IP地址、停止目录表以及使用其他文件作为index文件,等等......1. Introduction 介绍文件名 .htaccess 属性 644 (RW-R–R–)htaccess会影响它所在目录下的所有子目录注意大多数内容都要求保持在一行之内,不要换行,否则会引起错误2. Error Documents 错误文档Official document: ErrorDocument DirectiveErrorDocument code document例子ErrorDocument 400 /errors/badrequest.htmlErrorDocument 404 http://yoursite/errors/notfound.htmlErrorDocument 401 “Authorization Required”(注意之后内容如果出现的双引号需要转义为 \\”)常见HTTP状态码Successful Client Requests200 OK201 Created202 Accepted203 Non-Authorative Information204 No Content205 Reset Content206 Partial ContentClient Request Redirected300 Multiple Choices301 Moved Permanently302 Moved Temporarily303 See Other304 Not Modified305 Use ProxyClient Request Errors400 Bad Request401 Authorization Required402 Payment Required (not used yet)403 Forbidden404 Not Found405 Method Not Allowed406 Not Acceptable (encoding)407 Proxy Authentication Required408 Request Timed Out409 Conflicting Request410 Gone411 Content Length Required412 Precondition Failed413 Request Entity Too Long414 Request URI Too Long415 Unsupported Media TypeServer Errors500 Internal Server Error501 Not Implemented502 Bad Gateway503 Service Unavailable504 Gateway Timeout505 HTTP Version Not Supported3. Password Protection 密码保护Official document: Authentication, Authorization and Access Control假设密码文件为.htpasswdAuthUserFile /usr/local/safedir/.htpasswd (这里必须使用全路径名)AuthName EnterPasswordAuthType Basic两种常见验证方式:Require user windix(仅允许用户windix登陆)Require valid-user(所有合法用户都可登陆)Tip: 如何生成密码文件使用htpasswd命令(apache自带)第一次生成需要创建密码文件htpasswd -c .htpasswd user1之后增加新用户htpasswd .htpasswd user24. Enabling SSI Via htaccess 通过htaccess允许SSI(Server Side Including)功能AddType text/html .shtmlAddHandler server-parsed .shtmlOptions Indexes FollowSymLinks IncludesDirectoryIndex index.shtml index.html5. Blocking users by IP 根据IP阻止用户访问order allow,denydeny from 123.45.6.7deny from 12.34.5. (整个C类地址)allow from all6. Blocking users/sites by referrer 根据referrer阻止用户/站点访问需要mod_rewrite模块例1. 阻止单一referrer: badsite.comRewriteEngine on# Options +FollowSymlinksRewriteCond %{HTTP_REFERER} badsite\\.com [NC]RewriteRule .* - [F]例2. 阻止多个referrer: badsite1.com, badsite2.comRewriteEngine on# Options +FollowSymlinksRewriteCond %{HTTP_REFERER} badsite1\\.com [NC,OR]RewriteCond %{HTTP_REFERER} badsite2\\.comRewriteRule .* - [F][NC] - 大小写不敏感(Case-insensite)[F] - 403 Forbidden注意以上代码注释掉了”Options +FollowSymlinks”这个语句。如果服务器未在 httpd.conf 的 段落设置 FollowSymLinks, 则需要加上这句,否则会得到”500 Internal Server error”错误。
2007年11月12日 11点11分 3
level 6
grick 楼主
7. Blocking bad bots and site rippers (aka offline browsers) 阻止坏爬虫和离线浏览器需要mod_rewrite模块坏爬虫? 比如一些抓垃圾email地址的爬虫和不遵守robots.txt的爬虫(如baidu?)可以根据 HTTP_USER_AGENT 来判断它们(但是还有更无耻的如”中搜 zhongsou.com”之流把自己的agent设置为 “Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)” 太流氓了,就无能为力了)RewriteEngine OnRewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]RewriteCond %{HTTP_USER_AGENT} ^Bot\\ mailto:[email protected] [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]
2007年11月12日 11点11分 4
level 6
grick 楼主
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} ^ZeusRewriteRule ^.* - [F,L][F] - 403 Forbidden[L] - ?8. Change your default directory page 改变缺省目录页面DirectoryIndex index.html index.php index.cgi index.pl9. Redirects 转向单个文件Redirect /old_dir/old_file.html http://yoursite.com/new_dir/new_file.html整个目录Redirect /old_dir http://yoursite.com/new_dir效果: 如同将目录移动位置一样http://yoursite.com/old_dir -> http://yoursite.com/new_dirhttp://yoursite.com/old_dir/dir1/test.html -> http://yoursite.com/new_dir/dir1/test.htmlTip: 使用用户目录时Redirect不能转向的解决方法当你使用Apache默认的用户目录,如 http://mysite.com/~windix,当你想转向 http://mysite.com/~windix/jump时,你会发现下面这个Redirect不工作:Redirect /jump http://www.google.com正确的方法是改成Redirect /~windix/jump http://www.google.com(source: .htaccess Redirect in “Sites” not redirecting: why?)10. Prevent viewing of .htaccess file 防止.htaccess文件被查看order allow,denydeny from all11. Adding MIME Types 添加 MIME 类型AddType application/x-shockwave-flash swfTips: 设置类型为 application/octet-stream 将提示下载12. Preventing hot linking of images and other file types 防盗链需要mod_rewrite模块RewriteEngine onRewriteCond %{HTTP_REFERER} !^$RewriteCond %{HTTP_REFERER} !^http://(www/\\.)?mydomain.com/.*$ [NC]RewriteRule \\.(gif|jpg|js|css)$ - [F]解析:若 HTTP_REFERER 非空 (来源为其他站点,非直接连接) 并且若 HTTP_REFERER 非(www.)mydomain.com开头(忽略大小写[NC]) (来源非本站)对于所有含有 .gif/.jpg/.js/.css 结尾的文件给出 403 Forbidden 错误[F]也可指定响应,如下例显示替换图片RewriteRule \\.(gif|jpg)$[R,L][R] - 转向(Redirect)[L] - 连接(Link)13. Preventing Directory Listing 防止目录列表时显示IndexIgnore *IndexIgnore *.jpg *.gifTips:允许目录列表显示: Options +Indexes禁止目录列表显示: Options -Indexes显示提示信息: 页首 文件HEADER, 页尾 文件README
2007年11月12日 11点11分 5
1