【问题标题】:NGINX rewrite requests to file outside rootNGINX 将请求重写到根目录之外的文件
【发布时间】:2016-09-07 23:05:33
【问题描述】:

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

  • project_folder/
    • 公开/
    • 根/
    • index.php

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

root /project_folder/root/;

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

try_files $uri ../index.php?$query_string;

但这似乎不起作用。

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

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

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

我正在尝试做的事情是否可行,我将如何实现这一目标。

提前致谢。

【问题讨论】:

    标签: nginx configuration structure


    【解决方案1】:

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

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

    类似这样的:

    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 ...;
    }
    

    【讨论】:

    • 这个例子给了我很多工作。我设法删除了公共符号链接,并且还设法在命名位置的帮助下删除了索引文件。谢谢!
    【解决方案2】:

    添加别名很简单:

    location /public {
       alias /absolute/path/to/public;
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2016-11-25
      • 2013-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多