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

Подстановочный знак try_files подкаталога Nginx всегда терпит неудачу

Nginx 1.10.3 Ubuntu, стандартная установка apt. index index.php; расположен снаружи server блок.

Я нуждаюсь:

..и так далее.

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

server {
    server_name example.com;
    root   /var/www/example.com;
    location /test/1/ {
        try_files $uri $uri/ /test/1/index.php?$args;
    }
    location /test/2/ {
        try_files $uri $uri/ /test/2/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Из многих рекомендаций ни одна не работает.

Обычный PHP работает нормально. WordPress и Laravel выдали «Файл не найден»:

server {
    server_name example.com;
    location ~ ^/test/(?<content>.+)$ {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Файл не найден:

server {
    server_name example.com;
    location ~ ^/test/(?<content>[^/]+) {
        root   /var/www/example.com/test/$content;
        try_files $uri $uri/ /index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Во всех приведенных ниже попытках он загружает файл PHP вместо запуска PHP:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(?<content>[^/]+) {
        try_files $uri $uri/ /$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /(.*)/ {
        try_files $uri $uri/ /$1/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ /test/(?<content>.+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
    location ~ \.php$ {
        ...
}

Если можно, готов отдать 10 долларов за правильный ответ

Регулярное выражение location блоки оцениваются по порядку, поэтому .php блок должен быть помещен перед /test/... блок, иначе .php файлы под /test/ будет загружен, а не выполнен. Видеть этот документ для подробностей.

Ваша лучшая версия была второй после последней. Регулярное выражение извлекает только элемент пути, следующий за /test/ префикс.

Просто переверните location блоки. Например:

server {
    server_name example.com;
    root   /var/www/example.com;
    location ~ \.php$ {
        ...
    }
    location ~ /test/(?<content>[^/]+) {
        try_files $uri $uri/ /test/$content/index.php?$args;
    }
}