NGINX 重写请求到根目录之外的文件

Wim*_*ink 5 configuration structure nginx

目前我正在运行具有以下目录结构(简化)的网络项目:

  • 项目文件夹/
    • 民众/
    • 根/
    • 索引.php

我想要做的是将服务器块中的根设置为:

root /project_folder/root/;
Run Code Online (Sandbox Code Playgroud)

但是当请求位置不存在时,我希望它将请求转发到project_folder/index.php。我尝试了以下方法:

try_files $uri ../index.php?$query_string;
Run Code Online (Sandbox Code Playgroud)

但这似乎不起作用。

对于以 $document_root/public/* 开头的请求也是如此,需要将其转发到: $document_root/../public/*

我确实通过在 /project_folder/root/ 文件夹中添加一个 index.php 来管理这个问题,其中包括 /project_folder/index.php 。对于公共文件夹,我创建了一个符号链接。我可能可以通过为位置 /public/ 添加别名来解决这个问题,但是我试图使我的配置尽可能通用。

我试图阻止将 project_folder 设置为根文件夹,因为它有时包含我不希望从网络访问的文件。引入“根”文件夹是新的,但我正在尝试尽可能高效地做到这一点。现有的 Web 项目还没有根文件夹。

我正在尝试做的事情是可能的,以及我如何才能实现这一目标。

提前致谢。

Ric*_*ith 6

通常 PHP 文件是由location ~ \.php$块(或类似的块)处理的。我假设这index.php不是应用程序中唯一的 PHP 文件,并且要处理/root/目录结构中的 PHP 文件,该位置将需要使用root /project_folder/root.

您可以root为开始/public并使用命名位置执行根外index.php 文件的URI 指定不同的值。

像这样的东西:

root /project_folder/root;

location / {
    try_files $uri $uri/ @index;
}

location /public {
    root /project_folder;
}

location @index {
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME /project_folder/index.php;
    fastcgi_pass ...;
}

location ~ \.php$ {
    try_files $uri =404;

    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_pass ...;
}
Run Code Online (Sandbox Code Playgroud)