NGINX - 在多个目录中查找 .php 文件,然后执行它

NGNIX - look in multiple directories for a .php file and then excecute it

我在多个目录(/jobs/marketing/、/jobs/content/ 等)中有 .php 个文件需要完全映射到 /jobs/name-of-file.php .

例如点击 url:

/jobs/digital-marketing

需要映射到:

/jobs/marketing/digital-marketing.php 

可以安全地假设每个 php 文件的文件名在目录中是唯一的。

我当前的 nginx 设置如下:

location /jobs {
  expires max;
  add_header Cache-Control public;
  add_header Pragma public;

  rewrite ^/jobs[\/]?$ /marketing/jobs.php last;

  location ~* ^/jobs/([\-a-z0-9]*)$ {
    try_files /marketing/jobs/engineering/.php
              /marketing/jobs/marketing/.php
              /marketing/jobs/business-development/.php
              /marketing/jobs/content/.php;
  }

  location ~ ^/.+\.php($|/) {
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    include        fastcgi_params;
    fastcgi_read_timeout 3000;
   }
}

这看起来非常接近,除了下载文件的纯文本版本而不是 nginx 重定向到它。我想我需要以某种方式用另一个位置块捕获正确的文件,但我似乎没有任何效果(这甚至可能不是正确的方法)。

关于如何实现这一点有什么想法吗?或者更好的方法?

谢谢。

好的,如果您的实际位置指向正确的文件 - 我们就成功了一半。此时 nginx 正在尝试下载文件 - 让我们尝试添加另一个位置,将这些文件定向到 PHP 解析器 - 这个对我有用:

location ~ ^/.+\.php($|/) {
    fastcgi_split_path_info ^(.+\.php)(/.*)$;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;           
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
    include        fastcgi_params;
    fastcgi_read_timeout 3000;  
}

在您的位置后添加这段代码,让我知道这是否适合您。您可以通过 PHP here

阅读更多关于 nginx 的信息

我认为您使用 try_files 有点不对。它的作用是

Checks the existence of files in the specified order and uses the first found file for request processing; the processing is performed in the current context.

您有一个位置为 ~* ^/jobs/([-a-z0-9]*)$ 的上下文,另一个位置为 ~ ^/.+.php($|/)

所以您正在查找文件,但没有通过 PHP 处理它们,因为您的处理是在另一个上下文中进行的。

因此我认为您应该在 try_files 位置添加 php 处理。

location ~* ^/jobs/([\-a-z0-9]*)$ {
    try_files /marketing/jobs/engineering/.php
              /marketing/jobs/marketing/.php
              /marketing/jobs/business-development/.php
              /marketing/jobs/content/.php;

    ...
    fastcgi_param ...;
    fastcgi_pass ...;

  }

不要为 /jobs 和 .php 位置编写相同的配置,您可以将其剪切到文件并像使用 include fastcgi_params;

一样包含