【问题标题】:Nginx Block/Deny Access to multiple locations regexNginx 阻止/拒绝访问多个位置正则表达式
【发布时间】:2013-03-05 06:06:50
【问题描述】:

我使用 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;
}

【问题讨论】:

    标签: regex apache nginx


    【解决方案1】:

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

    【讨论】:

    • 是的,我确实想将它传递给 apache,感谢“Cuan Ma”我是 Nginx 的新手,但与 apache 相比,我更喜欢它。 :)
    • @C0nw0nk 太好了。使用 nginx 几年后,我再也不想回到 Apache。
    【解决方案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;
    }
    

    请注意,这将适用于/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

    【讨论】:

    • 您确定您的位置有效吗?你不应该使用~ 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 2020-09-11
    • 2017-04-11
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    相关资源
    最近更新 更多