Nginx - 在其他目录和PHP中使用root的位置

时间:2016-10-20 06:49:23

标签: php nginx nginx-location

我尝试使用Nginx设置类似“Apache Alias”的位置,但我无法在此文件夹中处理PHP脚本。

这是我的文件夹结构(适用于Dev环境):

/var/www
+-  dev/public/ <-- This is my normal Web root : "/"
|   +- assets/
|   |  +- app.css
|   |  +- app.js
|   |
|   +-  index.php
|   +-  favicon.png
|    
+-  cut/public/ <-- This must like an "Apache Alias" : "/cut"
    +- assets/
    |  +- app.css
    |  +- app.js
    |
    +-  index.php
    +-  other_other_file.php (why not)

我尝试了不同的解决方案,但没有一个正在运作。

这是我最好的Nginx配置:

server {
    listen   80;

    server_name _;
    root  /var/www/dev/public/;
    index index.php index.html;
    autoindex on;

    # Logs
    rewrite_log on;
    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    # Serving files
    location / {
        try_files $uri $uri/ @php;
    }

    location /cut {
        root /var/www/cut/public;
        try_files $uri $uri/ @php;
    }

    # PHP
    location @php {
        rewrite ^(.*)/?$ /index.php$is_args$args last;
    }

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param DOCUMENT_ROOT $document_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

有了这个,我的cut/public/文件夹的所有内容都会被重定向到dev/public/index.php并进行解释(我认为try_file的原因)。

这就是为什么欢迎你的帮助。

最终解决方案

在@ richard-smith回答之后,这是实施的解决方案:

server {
    listen   80;

    server_name _;
    root  /var/www/dev/public/;
    index index.php index.html;

    error_log /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;

    location ^~ /cut {
        rewrite ^/cut/?(.*)$ /cut/public/$1 last;
    }

    location ^~ /cut/public {
        root /var/www/;
        try_files $uri $uri/ /cut/index.php$is_args$args;

        location ~* \.php(/|$) {
            fastcgi_pass  php:9000;
            fastcgi_split_path_info ^(.+\.php)(/.*)$;
            fastcgi_param DOCUMENT_ROOT $document_root;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }

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

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        fastcgi_param DOCUMENT_ROOT $document_root;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

1 个答案:

答案 0 :(得分:7)

并行运行两个PHP应用程序,您需要一个公共文档根,或者您需要两个location ~* \.php(或类似)块以确保将正确的SCRIPT_FILENAME发送到fastcgi后端

使用嵌套的location块来隔离/cut子目录,并使用顶层的^~修饰符来避免其他顶级正则表达式location块干扰(见this documentation)。

alias指令(请参阅this documentation)用于将/cut映射到/var/www/cut/publicroot指令只能连接,这会使/var/www/cut/public/cut(你不想要)。

但是,由于this long term issue,我建议不要将alias指令与try_files指令一起使用。

因此,解决方案是默默地将/cut重写为/cut/public并使用值root /var/www

例如:

location ^~ /cut {
    rewrite ^/cut(.*)$ /cut/public$1 last;
}
location ^~ /cut/public {
    root /var/www;
    try_files $uri $uri/ /cut/index.php$is_args$args;

    location ~* \.php(/|$) {
        fastcgi_pass  php:9000;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}