NGINX - 查看.php文件的多个目录,然后执行它

时间:2015-02-20 23:05:41

标签: php http nginx configuration config

我在多个目录(/ jobs / marketing /,/ jobs / content / etc)中有.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重定向到它。我想我需要以某种方式用另一个位置块捕获正确的文件,但我似乎没有任何工作(这可能不是正确的方法)。

有关如何实现这一目标的任何想法?或者更好的方法呢?

感谢。

2 个答案:

答案 0 :(得分:3)

我相信你使用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位置编写相同的配置,您可以将其剪切为文件,并像包含fastcgi_params一样包含;

答案 1 :(得分:2)

好的,如果您的实际位置指向正确的文件 - 我们会在那里停留一半。此时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的更多信息