nginx 将参数重定向到子文件夹中的 php 索引?

nginx 将参数重定向到子文件夹中的 php 索引?

我有一个服务器块来执行 PHP 文件:

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

 location ~ \.php$ {
    fastcgi_pass unix:/run/php/php7.3-fpm.sock;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_index index.php;
    fastcgi_param HTTP_AUTHORIZATION $http_authorization;
    include fastcgi_params;
 }
 ## ... etc

}

我希望子文件夹执行自己的 index.php 文件,并将docs子文件夹路径下的任何内容(不带扩展名)重定向到 docs 文件夹内的 index.php,其余参数通过查询字符串传入,而不会影响根 index.php 文件的相同进程……哇,我解释得很糟糕。这里:

mysite.com/docs/introduction/getting-started会成为mysite.com/docs/?path=introduction/getting-started

mysite.com/foo/bar/会成为mysite.com/?path=foo/bar/

mysite.com/docs/introduction/getting-started/screenshot.jpg将提供该文件(因为它有一个扩展名)。

因此,对于给定的子文件夹,我希望有自己的 index.php 处理器来处理其余参数,如果这有意义的话。我试过

    location /docs {
        try_files $uri $uri/ /docs/index.php$query_string;
    }

如果有一个查询字符串值,而该值不存在,那么这很好 - 只有/docs/folder/subfolder/subsubfolder/etc。我可以看到它需要一个包含 (.*) 的表达式,但我尽力尝试,却无法使其工作。

我该怎么做呢?

答案1

您可以try_files与命名位置一起使用,并在命名位置内放置一个或多个重写规则。

例如:

location /docs {
    try_files $uri $uri/ @docs;
}
location @docs {
    rewrite ^(/[^/]+)/(.*)$ $1/index.php?path=$2 last;
}

请参阅手册页try_files改写

相关内容