曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 6476|回复: 0
打印 上一主题 下一主题

Location/LocationMatch 指令

[复制链接]

4918

主题

5880

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34395
跳转到指定楼层
楼主
发表于 2012-6-5 13:23:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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 指令的”漏网之鱼“的访问存在。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2025-5-4 19:38 , Processed in 0.080989 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表