Nginx阻止/拒绝访问多个位置正则表达式

时间:2013-03-16 15:06:09

标签: regex apache nginx

我使用Nginx作为我的Apache灌输的反向代理,作为安全功能,它阻止除了localhost之外的所有人访问phpmyadmin,webalizer等但是使用nginx它使Apache认为它是localhost所以它公开显示给每个人。

<LocationMatch "^/(?i:(?:xampp|security|phpmyadmin|licenses|webalizer|server-status|server-info))">
    Order deny,allow
    Deny from all
    Allow from ::1 127.0.0.0/8 \
        fc00::/7 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 \
        fe80::/10 169.254.0.0/16

    ErrorDocument 403 /
</LocationMatch>

我需要将以上规则模式匹配正则表达式转换为以下内容。

location /phpmyadmin {
        proxy_pass         htt://127.0.0.1:8080/phpmyadmin;
        allow 127.0.0.1;
        deny all;
    }

非常感谢任何熟悉Nginx正则表达式的人的帮助。

以下方法有效但会破坏搜索引擎友好的常规网站网址,例如domain.com/forums/server-info

location ~ /(xampp|security|phpmyadmin|licenses|webalizer|server-status|server-info) {
    deny  all;
}

2 个答案:

答案 0 :(得分:8)

由于apache正则表达式具有'^',我们可以使用'^'来强制从路径的开头进行匹配。

location ~ ^/(xampp|security|phpmyadmin|licenses|webalizer|server-status|server-info) {
  proxy_pass         http://127.0.0.1:8080$request_uri;
  .... allow/deny directives come here
}

[编辑]括号内的匹配字符串存储在$ 1中。所以你可以尝试

http://127.0.0.1:8080/$1

如果这就是你想要的。但是,我的理解是你想将整个uri路径传递给apache服务器。在这种情况下,使用nginx变量$ request_uri更简单。

答案 1 :(得分:2)

看起来你已经拥有它了。 为了安全起见,nginx将从上到下阅读,因此最后请保留deny:

location /(xampp|security|phpmyadmin|licenses|webalizer|server-status|server-info) {
  allow from ::1;
  allow from fc00::/7;
  allow from fe80::/10;
  allow 127.0.0.0/8;
  allow 10.0.0.0/8;
  allow 172.16.0.0/12;
  allow 192.168.0.0/16;
  allow 169.254.0.0/16;
  deny all;
}

请注意,这适用于/phpmyadmin等任何网址。包括/someplaceelse/phpmyadmin。您可以仅为http://host/phpmyadmin个匹配在此匹配前加^。虽然从它的声音来看,在这种情况下你可能不得不将它分成多个位置指令。

我不确定搜索引擎友好是什么意思。如果您希望可以访问server-info,只需将其从正则表达式中删除即可例。

对于phpmyadmin代理:

location ^/phpmyadmin {
    proxy_pass    http://127.0.0.1:8080; 
}

nginx将获取位置匹配中的所有内容并将其附加到http://127.0.0.1:8080

例如,您可以使用〜来修改此行为。 http://wiki.nginx.org/HttpCoreModule#location