<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>覃伟帆博客 &#187; Apache</title>
	<atom:link href="http://www.kuigg.com/cat/learning/apache/feed" rel="self" type="application/rss+xml" />
	<link>http://www.kuigg.com</link>
	<description></description>
	<lastBuildDate>Tue, 07 Feb 2012 14:15:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Apache中的 .htaccess文件使用手册</title>
		<link>http://www.kuigg.com/apache-htaccess</link>
		<comments>http://www.kuigg.com/apache-htaccess#comments</comments>
		<pubDate>Thu, 27 Sep 2007 10:23:17 +0000</pubDate>
		<dc:creator>kuiGG</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[学习资料]]></category>

		<guid isPermaLink="false">http://kuigg.com/?p=72</guid>
		<description><![CDATA[.htaccess文件提供了针对目录改变配置的方法。 * .htaccess文件 * 工作原理和使用方法 * 使用.htaccess文件的场合 * 指令的生效 * 认证举例 * 服务器端包含举例 * CGI举例 * 疑难解答 top .htaccess文件 相关模块 相关指令 * core * mod_auth * mod_cgi * mod_include * mod_mime * AccessFileName * AllowOverride * Options * AddHandler * SetHandler * AuthType * AuthName * AuthUserFile * AuthGroupFile * Require top 工作原理和使用方法 .htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法， 即，在一个特定的文档目录中放置一个包含一个或多个指令的文件， [...]]]></description>
			<content:encoded><![CDATA[<p>.htaccess文件提供了针对目录改变配置的方法。 </p>
<p>* .htaccess文件<br />
* 工作原理和使用方法<br />
* 使用.htaccess文件的场合<br />
* 指令的生效<br />
* 认证举例<br />
* 服务器端包含举例<br />
* CGI举例<br />
* 疑难解答 </p>
<p>top<br />
.htaccess文件<br />
相关模块 相关指令 </p>
<p>* core<br />
* mod_auth<br />
* mod_cgi<br />
* mod_include<br />
* mod_mime </p>
<p>* AccessFileName<br />
* AllowOverride<br />
* Options<br />
* AddHandler<br />
* SetHandler<br />
* AuthType<br />
* AuthName<br />
* AuthUserFile<br />
* AuthGroupFile<br />
* Require </p>
<p>top<br />
工作原理和使用方法 </p>
<p>.htaccess文件(或者”分布式配置文件”)提供了针对目录改变配置的方法， 即，在一个特定的文档目录中放置一个包含一个或多个指令的文件， 以作用于此目录及其所有子目录。 </p>
<p>说明：如果需要使用.htaccess以外的其他文件名，可以用AccessFileName指令来改变。 例如，需要使用.config，则可以在服务器配置文件中按以下方法配置： </p>
<p>AccessFileName .config </p>
<p>允许放在这些文件中的指令取决于AllowOverride指令， 此指令按类别决定了.htaccess文件中哪些指令才是有效的。 如果一个指令允许放在.htaccess文件中，则，在本手册的说明中，此指令会有一个覆盖段， 其中说明了为使此指令生效而必须在AllowOverride指令中设置的值。 </p>
<p>例如，本手册对AddDefaultCharset指令的说明表明了， 此指令可以用于.htaccess文件(见 Context一行)，而Override一行是”FileInfo”， 那么为使.htaccess中的此指令有效，则至少要设置”AllowOverride FileInfo”。<br />
例子:<br />
Context: server config, virtual host, directory, .htaccess<br />
Override: FileInfo </p>
<p>如果不能确定一个特定的指令是否允许用于.htaccess文件， 可以查阅手册中对指令的说明，看在Context(“上下文”)行中是否有”.htaccess.”。<br />
top<br />
使用.htaccess文件的场合 </p>
<p>一般情况下，不应该使用.htaccess文件，除非你对主服务器配置文件没有存取权限。 有一种很常见的误解，认为用户认证只能通过.htaccess文件实现，但并不是这样， 把用户认证写在主服务器配置中是完全可行的，而且是一种很好的方法。 </p>
<p>在内容提供者需要针对目录改变服务器的配置而对服务器系统没有root权限时， 则应该使用.htaccess文件。如果服务器管理员不愿意频繁修改配置， 则可以允许用户通过.htaccess文件自己修改配置，尤其是ISP在一个机器上 宿主多个用户站点，而又希望用户可以自己改变配置的情况下。 </p>
<p>虽然如此，一般都应该尽可能地避免使用.htaccess文件。 任何希望放在.htaccess文件中的配置，都可以放在主服务器的&lt;Directory&gt;段中，而且更高效。 </p>
<p>避免使用.htaccess文件有两个主要原因。 </p>
<p>首先是性能。 如果AllowOverride允许使用.htaccess文件， 则，Apache需要在每个目录中查找.htaccess文件，因此，无论是否真正用到， 允许使用.htaccess文件都会导致性能的下降。 另外，每次请求一个页面时，都需要读取.htaccess文件。 </p>
<p>还有，Apache必须在所有更高级的目录中查找.htaccess文件， 使所有有效的指令都起作用(参见how directives are applied.)，所以， 如果有对/www/htdocs/example中页面的请求，Apache必须查找以下文件： </p>
<p>/.htaccess<br />
/www/.htaccess<br />
/www/htdocs/.htaccess<br />
/www/htdocs/example/.htaccess </p>
<p>而且，对此目录以外的每个文件访问，还有4个附加的文件系统访问，即使这些文件都不存在。 (注意，这可能仅仅发生在 / 允许使用.htaccess文件的情况下，虽然这种情况并不多。) </p>
<p>其次是安全。 如此，会允许用户修改服务器的配置，可能会导致未加限制的修改，请认真考虑是否给予用户这样的特权。 但是，如果给予用户较少的特权而不能满足其需要，则会带来额外的技术支持请求， 所以，必须明确地告诉用户已经给予他们的权限，说明AllowOverride设置的值， 并引导他们参阅相应的说明，以免日后许多麻烦。 </p>
<p>注意，在/www/htdocs/example目录下.htaccess文件中放置指令，与， 在主服务器配置文件中&lt;Directory /www/htdocs/example&gt;段中放置相同指令， 是等效的。： </p>
<p>/www/htdocs/example中的.htaccess:<br />
/www/htdocs/example中.htaccess文件的内容 </p>
<p>AddType text/example .exm<br />
httpd.conf文件中的段 </p>
<p>&lt;Directory /www/htdocs/example&gt;<br />
AddType text/example .exm<br />
&lt;/Directory&gt; </p>
<p>但是，把这个配置放置在服务器配置文件中则更加高效，因为只需要在Apache启动时读取一次， 而不是在有文件请求时每次都读取。 </p>
<p>将AllowOverride设置为”none”可以完全禁止使用.htaccess文件。 </p>
<p>AllowOverride None<br />
top<br />
指令的生效 </p>
<p>.htaccess文件中的配置指令作用于.htaccess文件所在的目录及其所有子目录， 但是，很重要需要记住的是，其更高级的目录也可能会有.htaccess文件， 而指令是按查找顺序依次生效，所以， 一个特定目录下的.htaccess文件中的指令可能会覆盖其更高级目录中的 .htaccess文件的指令，即， 子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。 </p>
<p>例如: </p>
<p>目录/www/htdocs/example1中的.htaccess文件有如下内容： </p>
<p>Options +ExecCGI </p>
<p>(注意: 必须设置”AllowOverride Options”以允许在.htaccess文件中使用 “Options”指令。) </p>
<p>在目录/www/htdocs/example1/example2中的.htaccess文件有如下内容： </p>
<p>Options Includes </p>
<p>由于第二个.htaccess文件的存在，/www/htdocs/example1/example2中 的CGI执行是不允许的，而只允许Options Includes，它完全覆盖了之前的设置。<br />
top<br />
认证举例 </p>
<p>如果你为了知道如何认证，直接从这里开始看，有很重要的一点需要注意，有一种常见的误解， 认为实现密码认证必须要使用.htaccess文件，其实不是这样。 把认证指令放在主服务器配置文件的&lt;Directory&gt;段中，是一个更好的方法， 而.htaccess文件应该仅仅用于无权访问主服务器配置文件的时候。 参见上述的使用.htaccess文件的场合。 </p>
<p>有此声明在先，如果你仍然需要使用.htaccess文件，请看以下说明。 </p>
<p>必须设置”AllowOverride AuthConfig”以允许这些指令生效 </p>
<p>.htaccess文件的内容: </p>
<p>AuthType Basic<br />
AuthName “Password Required”<br />
AuthUserFile /www/passwords/password.file<br />
AuthGroupFile /www/passwords/group.file<br />
Require Group admins </p>
<p>注意，必须设置AllowOverride AuthConfig以允许这些指令生效 </p>
<p>更详细的有关身份识别和认证的说明，请参见authentication tutorial。<br />
top<br />
服务器端包含举例 </p>
<p>.htaccess文件的另一个常见用途是允许一个特定目录的服务器端包含(Server Side Includes)， 可以在需要的目录中放置.htaccess文件，并如下配置： </p>
<p>Options +Includes<br />
AddType text/html shtml<br />
AddHandler server-parsed shtml </p>
<p>注意，必须同时设置AllowOverride Options和 AllowOverride FileInfo使这些指令生效。 </p>
<p>更详细的有关服务器端包含的说明，请参见SSI tutorial。<br />
top<br />
CGI举例 </p>
<p>最后，可以通过.htaccess文件允许在特定目录中执行CGI程序，需按如下配置： </p>
<p>Options +ExecCGI<br />
AddHandler cgi-script cgi pl </p>
<p>另外，如下，可以使给定目录下所有文件被视为CGI程序： </p>
<p>Options +ExecCGI<br />
SetHandler cgi-script </p>
<p>注意，必须设置AllowOverride Options使这些指令生效。 </p>
<p>更详细的有关CGI编程和配置的说明，请参见CGI tutorial。<br />
top<br />
疑难解答 </p>
<p>如果在.htaccess文件中写入了配置指令但不起作用，可能有多种原因。 </p>
<p>最常见的原因是，AllowOverride指令没有被正确设置， 必须确保没有对此文件区域设置AllowOverride None。有一个很好的测试方法，即， 在.htaccess文件随便增加点没用的内容，如果服务器没有返回了一个错误消息， 那么几乎可以断定设置了AllowOverride None。 </p>
<p>在访问文档时，如果收到服务器的出错消息，应该检查Apache的出错日志， 可以知道.htaccess文件中哪些指令是不允许使用的，也可能会发现需要纠正的语法错误。 </p>
<p>.htaccess文件使用手册 </p>
<p>- .htaccess文件(或者”分布式配置文件”提供了针对目录改变配置的方法， 即，在一个特定的文档目录中放置一个包含一个或多个指令的文件，以作用于此目录及其所有子目录。作为用户，所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。 </p>
<p>- 子目录中的指令会覆盖更高级目录或者主服务器配置文件中的指令。 </p>
<p>- .htaccess必须以ASCII模式上传，最好将其权限设置为644。 </p>
<p>错误文档的定位 </p>
<p>常用的客户端请求错误返回代码：<br />
401 Authorization Required<br />
403 Forbidden<br />
404 Not Found<br />
405 Method Not Allowed<br />
408 Request Timed Out<br />
411 Content Length Required<br />
412 Precondition Failed<br />
413 Request Entity Too Long<br />
414 Request URI Too Long<br />
415 Unsupported Media Type<br />
常见的服务器错误返回代码：<br />
500 Internal Server Error </p>
<p>用户可以利用.htaccess指定自己事先制作好的错误提醒页面。一般情况下，人们可以专门设立一个目录，例如errors放置这些页面。然后再.htaccess中，加入如下的指令： </p>
<p>ErrorDocument 404 /errors/notfound.html<br />
ErrorDocument 500 /errors/internalerror.html </p>
<p>一条指令一行。上述第一条指令的意思是对于404，也就是没有找到所需要的文档的时候得显示页面为/errors目录下的notfound.html页面。不难看出语法格式为： </p>
<p>ErrorDocument 错误代码 /目录名/文件名.扩展名 </p>
<p>如果所需要提示的信息很少的话，不必专门制作页面，直接在指令中使用HTML号了，例如下面这个例子： </p>
<p>ErrorDocument 401 “&lt;body bgcolor=#ffffff&gt;&lt;h1&gt;你没有权限访问该页面，请放弃！&lt;/h1&gt;&lt;/body&gt;” </p>
<p>文档访问的密码保护 </p>
<p>要利用.htaccess对某个目录下的文档设定访问用户和对应的密码，首先要做的是生成一个.htpasswd的文本文档，例如： </p>
<p>zheng:y4E7Ep8e7EYV </p>
<p>这里密码经过加密，用户可以自己找些工具将密码加密成.htaccess支持的编码。该文档最好不要放在www目录下，建议放在www根目录文档之外，这样更为安全些。 </p>
<p>有了授权用户文档，可以在.htaccess中加入如下指令了： </p>
<p>AuthUserFile .htpasswd的服务器目录<br />
AuthGroupFile /dev/null （需要授权访问的目录）<br />
AuthName EnterPassword<br />
AuthType Basic （授权类型） </p>
<p>require user wsabstract （允许访问的用户，如果希望表中所有用户都允许，可以使用 require valid-user） </p>
<p>注，括号部分为学习时候自己添加的注释 </p>
<p>拒绝来自某个IP的访问 </p>
<p>如果我不想某个政府部门访问到我的站点的内容，那可以通过.htaccess中加入该部门的IP而将它们拒绝在外。 </p>
<p>例如： </p>
<p>order allow,deny<br />
deny from 210.10.56.32<br />
deny from 219.5.45.<br />
allow from all </p>
<p>第二行拒绝某个IP，第三行拒绝某个IP段，也就是219.5.45.0~219.2.45.255 </p>
<p>想要拒绝所有人？用deny from all好了。不止用IP，也可以用域名来设定。 </p>
<p>保护.htaccess文档 </p>
<p>在使用.htaccess来设置目录的密码保护时，它包含了密码文件的路径。从安全考虑，有必要把.htaccess也保护起来，不让别人看到其中的内容。虽然可以用其他方式做到这点，比如文档的权限。不过，.htaccess本身也能做到，只需加入如下的指令： </p>
<p>&lt;Files .htaccess&gt;<br />
order allow,deny<br />
deny from all<br />
&lt;/Files&gt; </p>
<p>URL转向 </p>
<p>我们可能对网站进行重新规划，将文档进行了迁移，或者更改了目录。这时候，来自搜索引擎或者其他网站链接过来的访问就可能出错。这种情况下，可以通过如下指令来完成旧的URL自动转向到新的地址： </p>
<p>Redirect /旧目录/旧文档名 新文档的地址 </p>
<p>或者整个目录的转向： </p>
<p>Redirect 旧目录 新目录 </p>
<p>改变缺省的首页文件 </p>
<p>一般情况下缺省的首页文件名有default、index等。不过，有些时候目录中没有缺省文件，而是某个特定的文件名，比如在pmwiki中是pmwiki.php。这种情况下，要用户记住文件名来访问很麻烦。在.htaccess中可以轻易的设置新的缺省文件名： </p>
<p>DirectoryIndex 新的缺省文件名 </p>
<p>也可以列出多个，顺序表明它们之间的优先级别，例如： </p>
<p>DirectoryIndex filename.html index.cgi index.pl default.htm </p>
<p>防止盗链 </p>
<p>如果不喜欢别人在他们的网页上连接自己的图片、文档的话，也可以通过htaccess的指令来做到。 </p>
<p>所需要的指令如下： </p>
<p>RewriteEngine on<br />
RewriteCond % !^$<br />
RewriteCond % !^http://(www\.)?mydomain.com/.*$ [NC]<br />
RewriteRule \.(gif|jpg)$ &#8211; [F] </p>
<p>如果觉得让别人的页面开个天窗不好看，那可以用一张图片来代替： </p>
<p>RewriteEngine on<br />
RewriteCond % !^$<br />
RewriteCond % !^http://(www\.)?mydomain.com/.*$ [NC]<br />
RewriteRule \.(gif|jpg)$ http://www.mydomain.com/替代图片文件名 [R,L] </p>
]]></content:encoded>
			<wfw:commentRss>http://www.kuigg.com/apache-htaccess/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

