nginx 删除 if 语句

nginx 删除 if 语句

我正在寻找一些针对 nginx 新手的建议。我读到过,如果语句在 nginx 中非常慢,所以我希望能得到一些帮助来转换它们。我尝试了很多不同的方法,但都失败了,所以我想提出一个问题。

server_name *.noconformity.co noconformity.co;
# remove all sub domains and www
if ($http_host !~* "^(ftp|ssh)\.noconformity\.co$"){
    set $rule_0 1$rule_0;
}
if ($http_host ~ "^([^.]+)\.noconformity\.co$"){
    set $rule_0 2$rule_0;
}
if ($rule_0 = "21"){
    rewrite ^/(.*)$ http://noconformity.co/$1 permanent;
    break;
}
# Login Short Cut
if ($uri ~* "/login") {
    rewrite ^/login(/.*)? /wp-admin$1;
}

答案1

完全未经测试 - 很可能有错误 - 但希望这个概念是有效的。

以下配置基于我对您的目标的理解:将除“ftp”和“ssh”之外的所有子域重定向到主站点;将/login 重定向到/wp-admin

创建一个服务器块来接受与 ftp 和 ssh 子域的连接 - 然后在这里执行某些操作(例如拒绝或返回 403 等) - 因为这是一个静态服务器名称,所以它优先于通配符服务器名称。

server {
    server_name ftp.noconformity.co ssh.noconformity.co;
    #additional options
}

您的主要服务器块 - 将重写添加到位置块

server{
    server_name noconformity.co;
    #root ....; 
    #your main config

    location ~* /login/ {
        rewrite ^/login/(.*)? /wp-admin$1;
    }
}

{我必须更改 /login/ 重写,以避免陷入内置 WP 登录重定向的循环}

最后,通配符 server_name - 这将匹配任何子域(已经匹配的子域除外)捕获路径,并重写到您的主站点。

server {
    server_name *.noconformity.co;
    rewrite ^/(.*)$ http://noconformity.co/$1 permanent;
}

nginxserver_names 页面值得一读,因为它解释了不同 server_name 表达式的优先级。

答案2

这个问题的更好答案是使用HTTP 映射模块。您上面的例子几乎和他们演示的一样。更简洁,更易于管理。

相关内容