文件+别名指令

我试图向位于文档根目录之外的文件夹中的php代码的/ blog子目录提供请求。 这是我的主机配置:

server {
    server_name  local.test.ru;
    root   /home/alex/www/test2;

    location /blog {
        alias   /home/alex/www/test1;
        try_files $uri $uri/ /index.php$is_args$args;

        location ~ .php$ {
            fastcgi_split_path_info ^(/blog)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
        }
    }
}

我得到的请求像

wget -O - http://local.test.ru/blog/nonExisting

只是/ home / alex / www / test2 /文件夹中的index.php文件的代码。

但是,这个配置:

server {
    server_name  local.test.ru;
    root   /home/alex/www/test2;

    location /blog {
        alias   /home/alex/www/test1;
        try_files $uri $uri/ /blog$is_args$args;
        index index.php;

        location ~ .php$ {
            fastcgi_split_path_info ^(/blog)(/.*)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            include fastcgi_params;
        }
    }
}

给我从/ home / alex / www / test2 /的index.html文件。 请给我一个线索 - 为什么? 我该如何强制NGINX处理/home/alex/www/test1/index.php呢?


这是nginx中的一个长期存在的错误。 但是你可以通过再次使用root指令来解决。 一种黑客,但至少它有效。

server {
    index       index.php;
    root        /home/alex/www/test2;
    server_name local.test.ru;

    location /blog {
        root      /home/alex/www/test1;
        try_files $uri $uri/ /blog$is_args$args;
    }
}

我们无法通过在位置块中指定root来使其工作。 我们的解决方案是使用别名。 请注意,有必要在try_files指令中重复两次位置路径,然后在.php配置块中重复该位置的路径:

server {
    server_name localhost;
    root /app/frontend/www;

    location /backend/ {

        alias /app/backend/www/;

        # serve static files direct + allow friendly urls
        # Note: The seemingly weird syntax is due to a long-standing bug in nginx: https://trac.nginx.org/nginx/ticket/97
        try_files $uri $uri/ /backend//backend/index.php?$args;

        location ~ /backend/.+.php$ {
            include fastcgi_params;
            fastcgi_buffers 256 4k;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_param HTTPS $proxied_https;
            fastcgi_pass phpfiles;
        }

    } # / location

}

来源:docker-stack项目中debian-php-nginx堆栈的nginx / conf.d / app.conf


还有另一种解决方法可以提供更多的灵活性。 它由一个指向127.0.0.1的proxy_pass指令和另一个server块组成。

在你的情况下,它应该看起来像这样:

upstream blog.fake {
    server 127.0.0.1;
}
server {
    server_name local.test.ru;
    root /home/alex/www/test2;
    index index.html;

    location /blog {
        proxy_pass http://blog.fake/;
    }
}
server {
    server_name blog.fake;
    root /home/alex/www/test1;

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

    location ~ .php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
}
链接地址: http://www.djcxy.com/p/32419.html

上一篇: files + alias directives

下一篇: fpm failed (2: No such file or directory)