Nginx, 重写 url 为一个有条件的子域,没有新的虚拟主机

Nginx, rewrite url for one subdomain with condition, without new virtual host

我正在尝试为一个特定的子域重写 URL。合乎逻辑的解决方案似乎是使用 if-else 来检查当前子域是否是那个子域。

我不想要一个新的虚拟主机,因为我通常为子域设置了很多东西,如果我为每个子域都做一个很长的部分会很混乱。

使用 Apache 很简单,只需一个 .htaccess 文件即可。在 nginx 中有没有一种方法可以像这样工作?

我试过的是这样的:

if ($subdomain = 'foo') {
    rewrite ^/(.*)$ /index.php?_url=/;
}

无效。知道怎么做吗?

P.S.: 澄清一下:变量 $subdomain 包含子域的名称。它们看起来像:subdomain.martinfejes.hu.

您需要像这样使用正则表达式匹配:

server {
    server_name ~ ^foo\.;

    location / {
       rewrite ^/(.*)$ /index.php?_url=/;
    }
}

这是一种糟糕的方法 - 因为 nginx 以非常非常快的方式处理虚拟主机,这与处理条件相反。一般来说,条件由 "simple virtual stack machine" 解释(参见 http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#internals)并且很慢。

此外,使用虚拟主机将限制可能的副作用,就像现在和未来的配置复杂性一样。