我正在寻找一些针对 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 映射模块。您上面的例子几乎和他们演示的一样。更简洁,更易于管理。