基于Nginx的Dokuwiki敏感目录访问限制

又一次将dokuwiki迁移到Nginx上,设置敏感目录访问权限时,发现之前的发过的一篇文章有错误,原文描述如下:

在Apache下,因为各目录下的.htaccess文件已经设置好了,所以无需任何修改就可以用,但是Nginx下不仅要禁止目录访问,还要加密目录,否则输入文件名依然可以下载。

正确的情形是 加密目录后可以自己下载敏感文件,包括php文件,因为php文件不再解析。

当时得出错误结论可能是因为浏览器缓存,今天改了配置后依然可以下载php文件,换个浏览器就正常返回403,看来测试的时候还是用站长之家的HTTP状态查询工具比较好:

403 forbidden

403 forbidden

当时的配置如下:

location ^~ /conf/
                        {
                                deny all;
                                auth_basic "Authorized users only";
                                auth_basic_user_file 验证文件路径;
                        }

                 location ^~ /data/
                        {
                                deny all;
                                auth_basic "Authorized users only";
                                auth_basic_user_file 验证文件路径;
                        }

                 location ^~ /inc/
                        {
                                deny all;
                                auth_basic "Authorized users only";
                                auth_basic_user_file 验证文件路径;
                        }

                 location ^~ /bin/
                        {
                                deny all;
                                auth_basic "Authorized users only";
                                auth_basic_user_file 验证文件路径;
                        }

去掉目录密码验证:

location ^~ /conf/
                        {
                                deny all;
                        }

                 location ^~ /data/
                        {
                                deny all;
                        }

                 location ^~ /inc/
                        {
                                deny all;
                        }

                 location ^~ /bin/
                        {
                                deny all;
                        }

经测试所有文件均正常返回403。看来加密码验证实在是多此一举,虽然也没有影响最后的效果,但设置起来挺麻烦的。

之后查找dokuwiki官方关于Nginx访问限制的配置

location ~ /(data|conf|bin|inc)/ {
      deny all;
    }

写在一起了, 实测php文件、图片文件等可以访问。其他类型文件返回403。这样影响也不大。PS:看了location语法后觉的还是用 ^~ 严格匹配目录比较好。

在Nginx官方wiki上也找到一篇,链接:http://wiki.nginx.org/Dokuwiki

学习一下location的语法

语法:location [=|~|~*|^~] /uri/ { … }
默认:否

上下文:server

这个指令随URL不同而接受不同的结构。你可以配置使用常规字符串和正则表达式。如果使用正则表达式,你必须使用 ~* 前缀选择不区分大小写的匹配或者 ~ 选择区分大小写的匹配。

确定 哪个location 指令匹配一个特定指令,常规字符串第一个测试。常规字符串匹配请求的开始部分并且区分大小写,最明确的匹配将会被使用(查看下文明白 nginx 怎么确定它)。然后正则表达式按照配置文件里的顺序测试。找到第一个比配的正则表达式将停止搜索。如果没有找到匹配的正则表达式,使用常规字符串的结果。

有两个方法修改这个行为。第一个方法是使用 “=”前缀,将只执行严格匹配。如果这个查询匹配,那么将停止搜索并立即处理这个请求。例子:如果经常发生”/”请求,那么使用 “location = /” 将加速处理这个请求。

第二个是使用 ^~ 前缀。如果把这个前缀用于一个常规字符串那么告诉nginx 如果路径匹配那么不测试正则表达式。

而且它重要在于 NGINX 做比较没有 URL 编码,所以如果你有一个 URL 链接’/images/%20/test’ , 那么使用 “images/ /test” 限定location。

总结,指令按下列顺序被接受:
1. = 前缀的指令严格匹配这个查询。如果找到,停止搜索。
2. 剩下的常规字符串,长的在前。如果这个匹配使用 ^~ 前缀,搜索停止。
3. 正则表达式,按配置文件里的顺序。
4. 如果第三步产生匹配,则使用这个结果。否则使用第二步的匹配结果。

例子:

location = / {
# 只匹配 / 查询。
[ configuration A ]
}

location / {
# 匹配任何查询,因为所有请求都已 / 开头。但是正则表达式规则和长的块规则将被优先和查询匹配。
[ configuration B ]
}

location ^~ /images/ {
# 匹配任何已 /images/ 开头的任何查询并且停止搜索。任何正则表达式将不会被测试。
[ configuration C ]
}

location ~* \.(gif|jpg|jpeg)$ {
# 匹配任何已 gif、jpg 或 jpeg 结尾的请求。然而所有 /images/ 目录的请求将使用 Configuration C。
[ configuration D ]
}

例子请求:

/ -> configuration A

/documents/document.html -> configuration B

/images/1.gif -> configuration C

/documents/1.jpg -> configuration D

注意:按任意顺序定义这4个配置结果将仍然一样。

(location =) > (location 完整路径 ) >(location ^~ 路径) >(location ~*, ~ 正则) >(location 部分起始路径)
正则表达式根据配置文件中的前后顺序影响匹配, 前面的优先匹配. 其它则根据匹配长度来优先匹配.

参考:

1. http://wiki.nginx.org/NginxHttpCoreModule#location

2. http://www.eit.name/blog/read.php?497

最后吐槽一句,百度 “dokuwiki nginx” 前两页居然有9个结果是我博客的,快1/2强了,真无语了,dokuwiki中文资料咋就这么少呢...

2 thoughts on “基于Nginx的Dokuwiki敏感目录访问限制

  1. 按照网上nginx.conf的配置方法都试了,可还是无法禁止敏感目录访问。。。不知道怎么办了啊。。。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注