【问题标题】:Nginx $server_name in if statementif 语句中的 Nginx $server_name
【发布时间】:2014-02-07 13:33:06
【问题描述】:

这似乎不起作用:

server_name blabla.bla;    
    location ~* (wp-comments-posts|wp-login)\.php$ {
            if ($http_referer !~ ^(http://$servername) ) {
            return 405;
            }
     }

虽然

server_name blabla.bla;    
    location ~* (wp-comments-posts|wp-login)\.php$ {
            if ($http_referer !~ ^(http://blabla.bla) ) {
            return 405;
            }
     }

工作得很好。这是预期的吗?如果是,为什么?还是我在这里做错了什么?

【问题讨论】:

    标签: variables if-statement nginx server-name


    【解决方案1】:

    正则表达式在读取配置时编译,因此它们不能包含变量。

    另外请注意:

    【讨论】:

    • 谢谢!我知道“如果”是邪恶的,但让 php 执行所有暴力密码破解尝试更加邪恶(性能方面)。
    • 我的评论更多的是关于你使用$http_referer而不是特殊的$invalid_referer
    • 掌脸 谢谢!再次!
    • @greg 如果防止暴力攻击是您的目标,我建议您将其移至 TCP 层,使用 fail2ban
    【解决方案2】:

    如果您有可能喜欢这个的referer 模块,这将只允许当前服务器名称成为有效的referrer。所有其他都将返回 405 错误。

            location ~* (wp-comments-post)\.php$ {
                valid_referers server_names;
                
                if ( $invalid_referer ) {
                        return 405;
                }
    
                ### Do your stuff here
                  
            }
    

    【讨论】:

      猜你喜欢
      • 2015-12-25
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多