nginx try_files перенаправляет косую черту и 403 Forbidden
Я пытаюсь создать комбинированный шаблон "супер кеш" -> файл -> модуля с try_files (термин "супер кеш" взят из Wordpress супер кеша, так как это аналогичный метод).
Файлы, которые применимы для кэширования, находятся в папке "cache".
Файл должен быть обслужен, если он существует в одном из этих мест.
- /$ Кэш $ URI
- /$ Кэш $ URI /
- $ URI
- $ URI /
1.cache -> 2.file -> 3.pattern
location / {
try_files /$cache_dir$uri /$cache_dir$uri/ $uri $uri/ /index.php;
}
Пример с адресом 'domain.com/css/style588.css'
- ищите /srv/www/domain.com/public_html/cache
/css/style588.css
- ищите /srv/www/domain.com/public_html/cache
/css/style588.css
/index.html &.php - ищите /srv/www/domain.com/public_html
/css/style588.css
- ищите /srv/www/domain.com/public_html
/css/style588.css
/index.html &.php - если не найден: /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 запрещено (и перенаправления, когда нет косой черты, но папка существует в кеше?)
Пробовал устанавливать разрешения для папок, с тем же результатом.
Спасибо за вашу помощь!
1 ответ
Это должно работать:
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;
}