我有以下结构
/var/www/lsl/generalmedia
subcontent1/
picture.jpg
subcontent2/
subsub1/
picture.jpg
subsub2/
index.php
可通过以下方式访问website.com/lsl/generalmedia
我想让子目录使用相同的 index.php 文件,但正常提供文件服务。示例:
website.com/lsl/generalmedia/subcontent1
需要打电话lsl/generalmedia/index.php
website.com/lsl/generalmedia/subcontent1/picture.jpg
必须在浏览器中打开图片。
我尝试了以下操作,但每当我进入子目录时都会出现 403 禁止错误:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/;
index index.php;
server_name _;
location /lsl/generalmedia/ {
try_files $uri $uri/ @nested;
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_param SCRIPT_FILENAME /var/www/lsl/generalmedia/index.php;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
location @nested{
rewrite /lsl/generalmedia/(.*)$ /lsl/generalmedia/index.php?/$1 last;
}
location / {
try_files $uri $uri/ =404;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
}
}
答案1
$uri/
语句中的术语使try_files
Nginx 测试目录是否存在。请参阅这个文件了解详情。
由于subcontent1
是目录,Nginx 根据其指令对其进行处理。403 响应是因为该子目录中index
没有文件。index.php
删除该术语,例如:
location /lsl/generalmedia/ {
try_files $uri @nested;
}
此外,嵌套位置块永远不会被访问,因为任何以 结尾的 URI当前由您配置末尾的块.php
处理。location ~ \.php$
如果不需要 @nested 块中的具体重写,则可以在同一语句中指定默认 PHP 文件。例如:
location /lsl/generalmedia/ {
try_files $uri /lsl/generalmedia/index.php?$args;
}