如何使用 nginx 将 SUBDIRECTORY 下的所有路径提供给单个 PHP 文件?

如何使用 nginx 将 SUBDIRECTORY 下的所有路径提供给单个 PHP 文件?

我有以下结构

/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_filesNginx 测试目录是否存在。请参阅这个文件了解详情。

由于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;
}

相关内容