Назад | Перейти на главную страницу

Конфигурация nginx с несколькими корнями не работает

Согласно конфигу, site.com должен открыться html/web/index.php по умолчанию, однако site.com/ticket должен открыться html/ticket/index.php. Обе ticket и web папки, расположенные в html.

server {
    listen 80;
    return 301 https://$host$request_uri;
}

server {

add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;

    server_name  site.com;
    server_tokens off;

    root /usr/share/nginx/html/web;

    location / {
        index index.php;
    }

    error_page   404              /404.html;
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location ~ \.php$ {
        try_files $uri =404;
        include         fastcgi_params;
        fastcgi_pass    127.0.0.1:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    location ~ /\.ht {
        deny  all;
    }

    location /ticket {
            root /usr/share/nginx/html/ticket;
            index index.php index.html index.htm;
    }
}

Это открывает web/index.php, однако для /ticket это говорит Not found.

ОБНОВИТЬ

Вышеуказанное выглядит в /usr/share/nginx/html/ticket/ticket/index.php

Я тоже пробовал

location /ticket {
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
}

и

location /ticket {
    alias /usr/share/nginx/html/ticket;
    index index.php index.html index.htm;
}

Оба конфига заглядывают в /usr/share/nginx/html/web/ticket/index.php.

Он должен заглянуть в /usr/share/nginx/html/ticket/index.php

Полагаю, проблема в FastCGI

РЕШЕНИЕ

Проблема была в конфигурациях FastCGI

        try_files  $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;

Вам нужно использовать alias директива. nginx не добавляет полный нормализованный URI после каталога, указанного с помощью alias, как и с root.

Итак, ваш блок будет выглядеть так:

location /ticket {
    alias /usr/share/nginx/html/ticket;
    index index.php index.html index.html;
}

См. Документацию по root директива. Внутри location, он по-прежнему корень относительно, а не относительно этого конкретного местоположения.

Устанавливает корневой каталог для запросов. Например, со следующей конфигурацией

location /i/ {
    root /data/w3;
}

В /data/w3/i/top.gif файл будет отправлен в ответ на /i/top.gif запрос.

Поэтому у вас должны быть:

location /ticket/ {
    root /usr/share/nginx/html;
    index index.php index.html index.htm;
}

В противном случае он пытается получить доступ /usr/share/nginx/html/ticket/ticket/index.phpвместо этого.

Это сработает. Я это проверил.

server {

    server_name  site.com;
     server_tokens off;
    root /usr/share/nginx/html/web; 

   location / {
        index index.php;
    }

   location /ticket  {
        index index.php;
        alias /usr/share/nginx/html/ticket/;


    if (-f $request_filename) {
        break;
    }


    if (-d $request_filename) {
        break;
    }

    rewrite (.*) /ticket/index.php?$query_string;        

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

        }



    location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\.ht {
        deny  all;
    }


}