我正在尝试使用 try_files 创建一个组合的“超级缓存”->文件->模块模式(“超级缓存”术语取自 wordpress 超级缓存,因为它是一种类似的方法)。
适用于缓存的文件位于“缓存”文件夹内。
如果文件存在于其中一个位置,则应该提供该文件。
- /$缓存$uri
- /$缓存$uri/
- $uri
- $uri/
1.缓存 -> 2.文件 -> 3.模式
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
我尝试使用以下配置使其工作。我做错了什么?
从 nginx.conf 中包含 domain.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;
}
}
我尝试使用上述配置的示例
域名.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
已送达。
但网址显示为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;
}