8

我使用 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 正则表达式的人的帮助。

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

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

2 回答 2

9

由于 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 会更简单。

于 2013-03-16T18:38:36.933 回答
2

看起来你拥有它。为了安全起见,nginx 会从上到下读取,所以最后保留deny all:

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;
}

请注意,这将适用于任何 url ,例如/phpmyadmin等,包括/someplaceelse/phpmyadmin. 您可以在此匹配项前添加 ^ 仅用于http://host/phpmyadmin匹配项。尽管在这种情况下,您可能不得不将其拆分为多个位置指令。

我不确定您所说的搜索引擎友好是什么意思。如果您希望服务器信息可以访问,只需从正则表达式中删除它 | 案例。

对于 phpmyadmin 代理:

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

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

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

于 2013-03-16T17:49:30.840 回答