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

nginx try_files перенаправляет завершающую косую черту и 403 Forbidden

Я пытаюсь создать комбинированный шаблон «супер-кеш» -> файл -> модуль с помощью try_files (термин «супер-кеш» взят из супер-кеша wordpress, поскольку это аналогичный метод).

Файлы, которые можно использовать для кэширования, находятся внутри папки «cache».

Файл следует обслуживать, если он существует в одном из этих расположений.

  1. / $ cache $ uri
  2. / $ cache $ uri /
  3. $ uri
  4. $ uri /

1. кэш -> 2. файл -> 3. шаблон

    location / {
        try_files /$cache_dir$uri /$cache_dir$uri/ $uri $uri/ /index.php;
    }

Пример с адресом domain.com/css/style588.css

  1. найдите /srv/www/domain.com/public_html/cache/css/style588.css
  2. найдите /srv/www/domain.com/public_html/cache/css/style588.css/index.html и .php
  3. найдите /srv/www/domain.com/public_html/css/style588.css
  4. найдите /srv/www/domain.com/public_html/css/style588.css/index.html и .php
  5. если не найден: /srv/www/domain.com/public_html/index.php

Я попытался заставить его работать с конфигурацией ниже. Что я делаю не так?

включен domain.conf из nginx.conf

server {
    ## index index.html index.php (defined in http block, works)

    server_name domain.com;
    root        /srv/www/domain.com/public_html;

    ## cache directory ##
    set $cache_dir 'cache';

    ## no cache if post ##
    if ($request_method = POST) {
        set $cache_dir 'null dir';
    }

    ## 1.cache -> 2.file -> 3.pattern ##
    location / {
        try_files /$cache_dir$uri /$cache_dir$uri/ $uri $uri/ /index.php;
    }

    ## .php (set cgi.fix_pathinfo=0 in php.ini, especially if php is on another machine) ##
    location ~ \.php$ {
        try_files $uri =404;
        include /etc/nginx/fastcgi_params;
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
}

Примеры, которые я пробовал с конфигурацией выше

domain.com: (403 Запрещено)

public_html/index.php не обслуживается.

-

domain.com/non_existing_folder: (ХОРОШО)

public_html/index.php обслуживается.

-

domain.com/folder_exists_in_cache/: (ХОРОШО)

public_html/cache/folder_exists_in_cache/index.html обслуживается.

-

domain.com/folder_exists_in_cache: (перенаправление) (без косой черты в конце)

Заголовок перенаправления 301 постоянный. public_html/cache/folder_exists_in_cache/index.html обслуживается.

но URL отображается как domain.com/cache/folder_exists_in_cache/

-

uri domain.com/cache/existing_empty_folder: (403 Запрещено)

public_html/index.php не обслуживается.

-

Как мне избежать 403 запрещенного (и перенаправления, когда нет конечной косой черты, но папка существует в кеше?)

Пробовали устанавливать разрешения для папок с тем же результатом.

Спасибо за вашу помощь!

Это должно работать:

    location ~ \.php$ {
        try_files $uri =404;
        ...
    }
    location = / {
        try_files /nonexistent /index.php?q=$uri&$args;
    }
    location / {
        try_files $cache_dir$uri $cache_dir$uri/index.html $uri $uri/index.html /index.php?q=$uri&$args;
    }