nginx" try_files"这里不允许使用指令

时间:2014-08-14 13:25:42

标签: nginx vhosts

我想要实现的目标非常简单:

如果子域名以admin开头,请尝试直接从控制器admin.php投放所有其他案例,尝试使用site.php投放文件。

请注意,由于许多域名都指向我们,因此我不了解域名。 到目前为止我尝试了什么:

server {
    listen 8080;
    root /path/to/current/web;

    location / {
        if ($http_host ~ "^admin") {
            try_files $uri @rewriteadmin;
        }
        if ($http_host !~ "^admin") {
            try_files $uri @rewriteapp;
        }
    } 

    location @rewriteapp {
        rewrite ^(.*)$ /site.php/$1 last;
    }

    location @rewriteadmin {
        rewrite ^(.*)$ /admin.php/$1 last;
    }
    ...
 }

当然这个设置不起作用,并且给了我:[emerg] "try_files" directive is not allowed here

实现这一目标的最佳做法是什么?

2 个答案:

答案 0 :(得分:2)

您可以在server_name中使用正则表达式。因此,最好使用两个服务器块。

server {
    listen 8080 default_server;
    root /path/to/current/web;

    location / {
        try_files $uri @rewriteapp;
    } 

    location @rewriteapp {
        rewrite ^(.*)$ /site.php/$1 last;
    }

    ...
}

server {
    listen 8080;
    server_name ~^admin;
    # or better, if they all starts with "admin." token
    # server_name admin.*;
    root /path/to/current/web;

    location / {
        try_files $uri @rewriteadmin;
    } 

    location @rewriteadmin {
        rewrite ^(.*)$ /admin.php/$1 last;
    }

    ...
}

答案 1 :(得分:0)

快速解答:try_files必须位于location内。

快速修复:

location / {
    try_files $uri $uri/ /index.php?$args;
}

适用于我的CakePHP v 3.x

相关问题