Location 或 LocationMatch 指令提供了基于 URL 的访问控制,后者是前者的正则表达式版本。
<Location> 和 <Directory> 类似,也是以 </Location> 结尾的配置段,也就是说,它的书写形式为:<Location 匹配项>
... ...
</Location>
<Location> 配置段完全独立于文件系统之外操作。那什么是文件系统?
文件系统是指操作系统所看见的磁盘视图,比如,在Unix文件系统中,Apache会被默认安装到/usr/local/apache2 ,在Windows文件系统中,Apache会被默认安装到"C:/Program Files/Apache Group/Apache2"(注意:Apache始终用正斜杠而不是反斜杠作为路径的分隔符,即使是在Windows中)。
<Location> 和 <LocationMatch> 作用于网络空间的特定部分。在这里,可以简单的理解网络空间就是网址。
下面用实例来演示 <Location> 或 <LocationMatch> 的简单应用。
假设已经在 httpd.conf 里配置了一个虚拟机,其内容如下:
[Plain Text] 纯文本查看 复制代码 <VirtualHost 192.168.1.104:80>
ServerAdmin webmaster@groad.net
DocumentRoot /var/www/html/vhost-1
ServerName 192.168.1.104:80
<Directory /var/www/html/vhost-1>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
在该虚拟机的主目录下有一个子目录,名为 groad ,并且现在 groad 里面并没有任何文件,或者说是至少没有 index.xxx 一类可以默认解析的文件。如果你直接访问该空间时,会提示:
也许不想显示这个默认页面,我们可以使用 <Location> 指令给它自定义一个 403 页面,现在在上面的 <Directory> 配置段的下面添加如下内容:
[Plain Text] 纯文本查看 复制代码 <LocationMatch "^/groad/$">
Options -Indexes
ErrorDocument 403 /error/stop.html
</LocationMatch>
</VirtualHost>
其中位于 /var/www/error/ 目录下 stop.html 是我们的自定义文件,内容很简单,只有一句"Access Forbidden!”。提一点,在默认情况下 /var/www/ 是 apache 工作根目录,因此在 error 的前面会有一条反斜杠。
添加完后,可以 reload 或者重启一下 httpd 服务器:[root@beyes groad]# /etc/init.d/httpd reload
Reloading httpd configuration (via systemctl): [ OK ]
当你再次访问 http://192.168.1.104/groad/ 时,会看到下面的内容:
下面说明一下上面的代码含义:
Options -Indexes :表示强制去掉索引功能,即不能浏览该目录。
ErrorDocument 403 /error/stop.html :引导到自定义的 403 页面。
<LocationMatch "^/groad/$"> : 匹配网址(http://192.168.1.104) 后面部分。
对于上面的 LocationMatch 命令,我们精确匹配了一个 "/groad/" ,如果在浏览器里输入 http://192.168.1.104/groad ,那么浏览器会自动帮我们在 groad 后面再添加一个反斜杠,组合成 http://192.168.1.104/groad/ ,这样做之后符合了上面的正则。
但是如果我们尝试讲网址写成:http://192.168.1.104/groad/////// 会怎么样呢(后面多了许多的反斜杠)?
由上可见,不能显示自定义的 stop.html 页面。那么如下修改一下 <LocationMatch> 指令中的正则:
[Plain Text] 纯文本查看 复制代码 <LocationMatch "^/groad/+$">
再次输入网址可以看到:
实际上,上面的 <LocationMatch> 指令的做法就是当我们 yum 安装完 apache 后,打开 IP 地址时出现的默认首页,它的配置文件为 /etc/httpd/conf.d/welcome.conf ,其内容为:
[Plain Text] 纯文本查看 复制代码 [root[url=u.php?uid=10]@beyes[/url] groad]# cat /etc/httpd/conf.d/welcome.conf
#
# This configuration file enables the default "Welcome"
# page if there is no default index page present for
# the root URL. To disable the Welcome page, comment
# out all the lines below.
#
<LocationMatch "^/+$">
Options -Indexes
ErrorDocument 403 /error/noindex.html
</LocationMatch>
为什么要举出上面的 "groad//////" 这样的例子?
这么做,是想说明反斜线在文件系统中和在网络空间中的不同。在文件系统中,多个反斜线会被认为只有一个,比如:[root@beyes groad]# ls ////home///////////
beyes l4nneret lost+found mockbuild
[root@beyes groad]# ls /home/
beyes l4nneret lost+found mockbuild 上面两条的命令是一样的效果。但是在 URL 里这样是行不通的,<LocationMatch>指令和正则表达式版本的<Location>要求明确使用多重斜线。
现在手动在 groad 目录下创建一个默认的 index.html 文件,内容也只有一句话 ”hello vhost-1-80port“ ,那么在打开 http://www.groad.net/groad 时会看到:
这时候不再被引导到上面的 stop.html 页面,这是配置文件里面已经默认配置好了对 index.xxx 类的文件的解析,所以这里就不会再被引导到 403 页面了。那么,如果我们仍然希望用户不能访问到该目录下的任何页面或文件,如果访问了,还是将他们引导到之前的 stop.html 那里应该怎么办呢?修改上面的代码为:
[Plain Text] 纯文本查看 复制代码 <LocationMatch "^/groad/(.*)$">
Order allow,deny
Deny from all
Options -Indexes
ErrorDocument 403 /error/stop.html
</LocationMatch>
这时候再次访问时,可以看到:
上面的代码中,改变了 <LocationMatch> 的匹配内容,以及增加了下面两句话:
[Plain Text] 纯文本查看 复制代码 Order allow,deny
Deny from all
其中,Order allow,deny 的意思是,对于该配置段,allow 在 deny 之前被评估,也就是”默认拒绝所有访问“ ,任何不匹配 Deny 指令或者匹配 Allow 指令的客户都被允许访问。而 Deny from all 就强调了”所有的访问是禁止的“,换句话来说就是不会存在不匹配 Deny 指令的”漏网之鱼“的访问存在。 |