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

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
задан 29 August 2018 в 06:55
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;
    }
}
2
ответ дан 3 December 2019 в 20:12

Теги

Похожие вопросы