Корень подкаталога Nginx с PHP

Я запускаю nginx в контейнере докеров. Я хочу иметь подкаталог /web/ для доступа к моим личным файлам и проектам. Он также должен поддерживать php.

Ниже показано, с чем я работаю, но domain-a.com/web продолжает приводить к ошибке 404. Подтверждено, что PHP работает, поскольку тот же блок php работает на поддомене, но непосредственно в блоке server{}.

http {

    server {
        listen      443 ssl;
        server_name domain-a.com domain-b.com;

        # Mime types
        include /etc/nginx/confs/mime.types;

        # SSL
        include /etc/nginx/confs/nginx-ssl.conf;

        # Proxy to organizr
        # This works
        location / {
            proxy_pass http://organizr/;
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;

            # HTTP 1.1 support
            proxy_http_version 1.1;
            proxy_set_header Connection "";
        }

        # Root folder for my personal files/projects
        # Doesn't work
        location /web {
            index index.php index.html;
            root /etc/nginx/www;

            location ~ \.php$ {
                try_files $uri =404;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_pass php:9000;
                fastcgi_index index.php;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_param PATH_INFO $fastcgi_path_info;
            }
        }
    }
}

person Bob    schedule 15.11.2017    source источник
comment
Ваши файлы также находятся в подкаталоге, т.е. /etc/nginx/www/web/?   -  person Richard Smith    schedule 16.11.2017
comment
@RichardSmith Нет, они в /etc/nginx/www/   -  person Bob    schedule 16.11.2017


Ответы (1)


Если ваши файлы находятся в /etc/nginx/www, вам нужно будет использовать директиву alias, а не директиву root. Дополнительные сведения см. В этом документе.

Например:

location ^~ /web {
    index index.php index.html;
    alias /etc/nginx/www;

    if (!-e $request_filename) { rewrite ^ /web/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        fastcgi_pass php:9000;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
    }
}

Используйте $request_filename, чтобы получить правильный путь к файлу с псевдонимом. Избегайте try_files с alias из-за этой проблемы. См. это предупреждение об использовании if.

person Richard Smith    schedule 16.11.2017
comment
Спасибо. Это ответ. Сработало сразу. - person Bob; 17.11.2017