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

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

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

Мне нужно:

  • http://example.com/test/1указывает на /var/www/example.com/test/1
  • http://example.com/test/2указывает на /var/www/example.com/test/2

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

Поскольку я создам слишком много тестов, мне нужен подстановочный знак для 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 долларов за правильный ответ.

решение1

Блоки регулярных выражений 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;
    }
}

Связанный контент