NGNIX-在多个目录中查找一个.php文件,然后对其进行优化


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

我在多个目录(/jobs/marketing/,/jobs/content/等)中有.php文件,这些文件需要干净地映射到/jobs/name-of-file.php。

例如,点击网址:

/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/$1.php
              /marketing/jobs/marketing/$1.php
              /marketing/jobs/business-development/$1.php
              /marketing/jobs/content/$1.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重定向到它。我想我需要用另一个位置块找到正确的文件,但我似乎什么都不起作用(这甚至可能不是正确的方法)。

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

谢谢。

我认为您使用try_files有点错误。它的作用是

检查是否存在按指定顺序排列的文件,并使用第一个找到的用于请求处理的文件;执行处理在当前上下文中

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

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

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

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

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

好吧,如果您的实际位置指向正确的文件,我们已经完成了一半。目前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;  
}

在你的位置后添加这段代码,让我知道这是否适合你。你可以在这里阅读更多关于nginx和PHP的信息