Вложенное местоположение Nginx с перезаписью маршрута

Я хотел бы вложить несколько выделенных маршрутов на сайт в определенные каталоги, которые могут иметь разные имена. Я не могу понять, как переписать путь, который он использует для try_files.

server {           
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/default;

    index index.html;

    server_name _;

    if ($bad_referer) {
        return 444;
    }

    location / {
        try_files $uri $uri/ =404;
    }

    location /postfixadmin/ {
        access_log /var/log/nginx/postfixadmin/access.log;
        error_log /var/log/nginx/postfixadmin/error.log;

        root /var/www/postfixadmin/;
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php;


        location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }

        location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ {
            expires 168h;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
    }

    location /email/ {

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

        root /var/www/roundcube/;
        index index.php index.html index.htm;
        try_files $uri $uri/ /index.php;

        location ~ \.php$ {
            include fastcgi.conf;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }

        location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ {
            expires 168h;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
    }
}

Когда я перехожу к www.site.com/email, я получаю 404, и я предполагаю, что это потому, что он ищет /var/www/roundcube/email/index.php, которого не существует. Что мне нужно сделать, чтобы переписать путь к файлу перед try_files?


person BayssMekanique    schedule 04.02.2017    source источник
comment
Вы можете использовать директивы root или alias, чтобы указать NGINX, где искать.   -  person Faisal Memon    schedule 04.02.2017


Ответы (1)


Я нашел решение, и оно оказалось довольно простым. При использовании alias вместо root используется только часть строки после части, соответствующей location, поэтому я искал в правильном каталоге. Другая проблема заключалась в том, что PHP не передавалось правильное имя сценария, поэтому он все еще искал не в том месте. Решение было перейти в fastcgi_param SCRIPT_FILENAME $request_filename;. Я также смог избавиться от раздела try_files, хотя я не уверен на 100%, почему.

Вот рабочие решения:

server {           
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/default;

    index index.html;

    server_name _;

    if ($bad_referer) {
        return 444;
    }

    try_files $uri $uri/ =404;

    location /postfixadmin {
        alias /var/www/postfixadmin/;
        index index.php index.html index.htm;

        location ~ /postfixadmin/.+\.php$ {
            include fastcgi.conf;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }

        location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ {
            expires 168h;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
    }

    location /email {
        alias /var/www/roundcube/;
        index index.php index.html index.htm;

        location ~ /email/.+\.php$ {
            include fastcgi.conf;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            fastcgi_param SCRIPT_FILENAME $request_filename;
            fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
        }

        location ~* \.(css|js|gif|jpe?g|png|woff|woff2|ttf|eot|svg|ico)$ {
            expires 168h;
            add_header Pragma public;
            add_header Cache-Control "public, must-revalidate, proxy-revalidate";
        }
    }
}
person BayssMekanique    schedule 04.02.2017