Apache中的htaccess文件使用详解Word文档格式.docx
《Apache中的htaccess文件使用详解Word文档格式.docx》由会员分享,可在线阅读,更多相关《Apache中的htaccess文件使用详解Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
不难看出语法格式为:
ErrorDocument错误代码/目录名/文件名.扩展名
如果所需要提示的信息很少的话,不必专门制作页面,直接在指令中使用HTML号了,例如下面这个例子:
ErrorDocument401"
你没有权限访问该页面,请放弃!
"
文档访问的密码保护
要利用.htaccess对某个目录下的文档设定访问用户和对应的密码,首先要做的是生成一个.htpasswd的文本文档,例如:
zheng:
y4E7Ep8e7EYV
这里密码经过加密,用户可以自己找些工具将密码加密成.htaccess支持的编码。
该文档最好不要放在www目录下,建议放在www根目录文档之外,这样更为安全些。
有了授权用户文档,可以在.htaccess中加入如下指令了:
AuthUserFile.htpasswd的服务器目录
AuthGroupFile/dev/null(需要授权访问的目录)
AuthNameEnterPassword
AuthTypeBasic(授权类型)
requireuserwsabstract(允许访问的用户,如果希望表中所有用户都允许,可以使用requirevalid-user)
注,括号部分为学习时候自己添加的注释
拒绝来自某个IP的访问
如果我不想某个政府部门访问到我的站点的内容,那可以通过.htaccess中加入该部门的IP而将它们拒绝在外。
例如:
orderallow,deny
denyfrom210.10.56.32
denyfrom219.5.45.
allowfromall
第二行拒绝某个IP,第三行拒绝某个IP段,也就是219.5.45.0~219.2.45.255
想要拒绝所有人?
用denyfromall好了。
不止用IP,也可以用域名来设定。
保护.htaccess文档
在使用.htaccess来设置目录的密码保护时,它包含了密码文件的路径。
从安全考虑,有必要把.htaccess也保护起来,不让别人看到其中的内容。
虽然可以用其他方式做到这点,比如文档的权限。
不过,.htaccess本身也能做到,只需加入如下的指令:
denyfromall
URL转向
我们可能对网站进行重新规划,将文档进行了迁移,或者更改了目录。
这时候,来自搜索引擎或者其他网站链接过来的访问就可能出错。
这种情况下,可以通过如下指令来完成旧的URL自动转向到新的地址:
Redirect/旧目录/旧文档名新文档的地址
或者整个目录的转向:
Redirect旧目录新目录
改变缺省的首页文件
一般情况下缺省的首页文件名有default、index等。
不过,有些时候目录中没有缺省文件,而是某个特定的文件名,比如在pmwiki中是pmwiki.php。
这种情况下,要用户记住文件名来访问很麻烦。
在.htaccess中可以轻易的设置新的缺省文件名:
DirectoryIndex新的缺省文件名
也可以列出多个,顺序表明它们之间的优先级别,例如:
DirectoryIndexfilename.htmlindex.cgiindex.pldefault.htm
防止盗链
如果不喜欢别人在他们的网页上连接自己的图片、文档的话,也可以通过htaccess的指令来做到。
所需要的指令如下:
RewriteEngineon
RewriteCond%!
^$
^http:
//(www\.)?
[NC]
RewriteRule\.(gif|jpg)$-[F]
如果觉得让别人的页面开个天窗不好看,那可以用一张图片来代替:
RewriteRule\.(gif|jpg)$[R,L]
Apache的ReWrite的应用大全
Apache的mod_rewrite是提供了强大URL操作的杀手级的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使是Apache专家有时也会发掘出mod_rewrite的新用途。
换句话说:
对mod_rewrite,或者是打退堂鼓永不再用,或者是喜欢它并一生受用。
ReWrite可以应用在以下方面或者解决以下问题:
URL的规划
规范的URL
说明:
在有些网站服务器上,一个资源会拥有多个URL,在实际应用和发布中应该被使用的是规范的URL,其他的则是简写或者是内部使用的。
无论用户在请求中使用什么形式的URL,他最终看见的都应该是规范的URL。
方案:
对所有的不规范的URL执行一个外部的HTTP重定向,以改变它在浏览器地址栏中的显示及其后继的请求。
下例中的规则集用规范的/u/user替换/~user,并修正了/u/user所遗漏的后缀的斜杠。
代码:
RewriteRule^/~([^/]+)/?
(.*)/u//[R]
RewriteRule^/([uge])/([^/]+)$///[R]
规范的主机名
...
^fully\.qualified\.domain\.name[NC]
^80$
RewriteRule^/(.*)http:
//fully.qualified.domain.name:
%/[L,R]
//fully.qualified.domain.name/[L,R]
被移动过的DocumentRoot
通常,网站服务器的DocumentRoot直接对应于URL"
/"
,但是,它常常不是处于最高一级,而可能只是众多数据池中的一个实体。
比如,在Intranet站点中,有/e/www/(WWW的主页)、/e/sww/(Intranet的主页)等等,而DocumentRoot指向了/e/www/,则必须保证此数据池中的所有内嵌的图片和其他元素对后继请求有效。
只须重定向URL/到/e/www/即可。
这个方案看起来很简单,但只是有了mod_rewrite模块的支持,它才简单,因为传统的URLAliases机制(由mod_alias及其相关模块提供)只是作了一个前缀匹配,DocumentRoot是一个对所有URL的前缀,因而无法实现这样的重定向。
而用mod_rewrite的确很简单:
RewriteRule^/$/e/www/[R]
后缀斜杠的问题
每个网管对引用目录后缀斜杠的问题都有一本苦经,如果遗漏了,服务器会产生一个错误,因为如果请求是/~quux/foo而不是/~quux/foo/,服务器会去找一个叫foo的文件,而它是一个目录,所以就报错了。
事实上,大多数情况下,它自己会试图修正这个错误,但是有时候需要你手工纠正,比如,在重写了许多CGI脚本中的复杂的URL以后。
解决这个微妙问题的方案是让服务器自动添加后缀的斜杠。
对此,必须使用一个外部的重定向,使浏览器正确地处理后继的对诸如图片的请求。
如果仅仅作一个内部的重写,可能只对目录页面有效,而对内嵌有使用相对URL的图片的页面则无效,因为浏览器有请求内嵌目标的可能。
比如,如果不用外部重定向,/~quux/foo/index.html页面中对image.gif的请求,其结果将是/~quux/image.gif!
。
所以,应该这样写:
RewriteBase/~quux/
RewriteRule^foo$foo/[R]
又懒又疯狂的做法是把这些写入其宿主目录中的顶级.htaccess中,但是须注意,如此会带来一些处理上的开销。
RewriteCond%-d
RewriteRule^(.+[^/])$/[R]
集群网站的同类URL规划
我们希望在一个Intranet集群网站中,对所有WWW服务器建立一个同类的一致性的URL规划,也就是,所有的URL(对单个服务器来说,是本地的依赖于此服务器的!
)是独立于服务器的!
我们需要的是一个具有独立于服务器的一致性规划的WWW名称空间,即,URL不需要包含正确的物理的目标服务器,而由集群本身来自动定位物理的目标主机。
首先,目标服务器的信息来自(产生)于包含有用户、组以及实体的外部地图,其格式形如:
user1server_of_user1
user2server_of_user2
:
:
这些信息被存入map.xxx-to-host文件。
其次,如果URL在一个服务器上无效,需要引导所有的服务器重定向URL
/u/user/anypath
/g/group/anypath
/e/entity/anypath
到
http:
//physical-host/u/user/anypath
//physical-host/g/group/anypath
//physical-host/e/entity/anypath
以下规则集依靠地图文件来完成这个操作(假定,如果一个用户在地图中没有对应的项,则使用server0为默认服务器):
RewriteMapuser-to-hosttxt:
/path/to/map.user-to-host
RewriteMapgroup-to-hosttxt:
/path/to/map.group-to-host
RewriteMapentity-to-hosttxt:
/path/to/map.entity-to-host
RewriteRule^/u/([^/]+)/?
(.*)http:
//$/u//
RewriteRule^/g/([^/]+)/?
//$/g//
RewriteRule^/e/([^/]+)/?
//$/e//
RewriteRule^/([uge])/([^/]+)/?
$///.www/
RewriteRule^/([uge])/([^/]+)/([^.]+.+)///.www/\
移动宿主目录到不同的网站服务器
通常,许多网管在建立一个新的网站服务器时,都会有这样的要求:
重定向一个网站服务器上的所有宿主目录到另一个网站服务器。
很简单,用mod_rewrite。
在老的网站服务器上重定向所有的URL/~user/anypath到http:
//newserver/~user/anypath。
RewriteRule^/~(.+)http:
//newserver/~[R,L]
结构化的宿主目录
一些拥有几千个用户的网站通常都使用结构化的宿主目录规划,即,每个宿主目录位于一个带有特定前缀比如其用户名的第一个字符的子目录下。
那么,/~foo/anypath代表/home/f/foo/.www/anypath,而/~bar/anypath代表/home/b/bar/.www/anypath。
可以使用下列规则集来扩展~以达到上述目的。
RewriteRule^/~(([a-z])[a-z0-9]+)(.*)/home///.www
文件系统的重组
这是一个不加雕琢的例子:
一个大量使用针对目录的规则集以实现平滑观感,而从来不用调整数据结构的杀手级的应用。
背景:
net.sw从1992年开始,存放了我收集的免费的有效的Unix软件包。
它是我的爱好也是我的工作,因为在学习计算机科学的同时,业余时间还做了多年的系统和网络的管理员。
每周我都需要整理软件,因而建立了一个层次很深的目录结构来存放各种软件包:
drwxrwxr-x2netswusers512Aug318:
39Audio/
drwxrwxr-x2netswusers512Jul914:
37Benchmark/
drwxrwxr-x12netswusers512Jul900:
34Crypto/
drwxrwxr-x5netswusers512Jul900:
41Database/
drwxrwxr-x4netswusers512Jul3019:
25Dicts/
drwxrwxr-x10netswusers512Jul901:
54Graphic/
drwxrwxr-x5netswusers512Jul901:
58Hackers/
drwxrwxr-x8netswusers512Jul903:
19InfoSys/
drwxrwxr-x3netswusers512Jul903:
21Math/
24Misc/
drwxrwxr-x9netswusers512Aug116:
33Network/
drwxrwxr-x2netswusers512Jul905:
53Office/
drwxrwxr-x7netswusers512Jul909:
24SoftEng/
drwxrwxr-x7netswusers512Jul912:
17System/
drwxrwxr-x12netswusers512Aug320:
15Typesetting/
drwxrwxr-x10netswusers512Jul914:
08X11/
1996年7月,我决定通过一个漂亮的Web接口公开我的收藏。
“漂亮”是指提供一个接口以直接浏览整个目录结构,同时不对这个结构做任何改变-甚至也不在结构顶部放置CGI脚本。
为什么呢?
因为这个结构还要能够被FTP访问,而且我不希望其中有任何Web或者CGI的成分。
这个方案分为两个部分:
第一个部分,是用于在空闲时间建立所有目录页面的CGI脚本集。
我把它们放在/e/netsw/.www/,如下:
-rw-r--r--1netswusers1318Aug118:
10.wwwacl
drwxr-xr-x18netswusers512Aug515:
51DATA/
-rw-rw-rw-1netswusers372982Aug516:
35LOGFILE
-rw-r--r--1netswusers659Aug409:
27TODO
-rw-r--r--1netswusers5697Aug118:
01netsw-about.html
-rwxr-xr-x1netswusers579Aug210:
33netsw-access.pl
-rwxr-xr-x1netswusers1532Aug117:
35netsw-changes.cgi
-rwxr-xr-x1netswusers2866Aug514:
49netsw-home.cgi
drwxr-xr-x2netswusers512Jul823:
47netsw-img/
-rwxr-xr-x1netswusers24050Aug515:
49netsw-lsdir.cgi
-rwxr-xr-x1netswusers1589Aug318:
43netsw-search.cgi
-rwxr-xr-x1netswusers1885Aug117:
41netsw-tree.cgi
-rw-r--r--1netswusers234Jul3016:
35netsw-unlimit.lst
其中的DATA/子目录包含了上述目录结构,即实在的net.sw,由rdist在需要的时候自动更新。
第二个部分的遗留问题是:
如何连接这两个结构为一个平滑观感的URL树?
我希望在运行适当的CGI脚本而使用各种URL的时候,使用户感觉不到DATA/目录的存在。
方案如下:
首先,我把下列配置放在服务器上DocumentRoot中的针对目录的配置文件里,以重写公布的URL/net.sw/为内部路径/e/netsw:
RewriteRule^net.sw$net.sw/[R]
RewriteRule^net.sw/(.*)$e/netsw/
第一条规则是针对遗漏后缀斜杠的请求的!
第二条规则才是真正实现功能的。
接着,就是放在针对目录的配置文件/e/netsw/.www/.wwwacl中的杀手级的配置了:
OptionsExecCGIFollowSymLinksIncludesMultiViews
#wearereachedvia/net.sw/prefix
RewriteBase/net.sw/
#firstwerewritetherootdirto
#thehandlingcgiscript
RewriteRule^$netsw-home.cgi[L]
RewriteRule^index\.html$netsw-home.cgi[L]
#stripoutthesubdirswhen
#thebrowserrequestsusfromperdirpages
RewriteRule^.+/(netsw-[^/]+/.+)$[L]
#andnowbreaktherewritingforlocalfiles
RewriteRule^netsw-home\.cgi.*-[L]
RewriteRule^netsw-changes\.cgi.*-[L]
RewriteRule^netsw-search\.cgi.*-[L]
RewriteRule^netsw-tree\.cgi$-[L]
RewriteRule^netsw-about\.html$-[L]
RewriteRule^netsw-img/.*$-[L]
#anythingelseisasubdirwhichgetshandled
#byanothercgiscript
RewriteRule!
^netsw-lsdir\.cgi.*-[C]
RewriteRule(.*)netsw-lsdir.cgi/
阅读提示:
注意前半部分中的标志L(最后),和无对应项('
-'
)
注意后半部分中的符号!
(非),和标志C(链)
注意最后一条规则的全匹配模式
NCSAimagemap和Apachemod_imap
许多人都希望在从NCSA网站服务器向较现代的Apache网站服务器转移中实现平滑过渡,即希望老的NCSAimagemap程序能在Apache的较现代的mod_imap支持下正常运作。
但问题在于,到处都是通过/cgi-bin/imagemap/path/to/page.map引用imagemap程序的连接,而在Apache下,应该写成/path/to/page.map。
使用全局规则在空闲时间去除所有这些请求的前缀:
RewriteRule^/cgi-bin/imagemap(.*)[PT]
在多个目录中搜索页面
有时会有必要使网站服务器在多个目录中搜索页面,对此,MultiViews或者其他技术无能为力。
编制一个明确的规则集以搜索目录中的文件。
#firsttrytofinditincustom/...
#...andiffoundstopandbehappy: