Search code examples
phphttpnginxconfigurationconfig

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


I have .php files in multiple directories (/jobs/marketing/, /jobs/content/ etc) that need to map cleanly to /jobs/name-of-file.php.

For example hitting the url:

/jobs/digital-marketing

needs to map to:

/jobs/marketing/digital-marketing.php 

It's safe to assume the file name of each php file is unique across directories.

my current nginx setup is the following:

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

This seems pretty close, except a plain text version of the file gets downloaded instead of nginx redirecting to it. I think I need to somehow catch the correct file with another location block, but I nothing seems to be working (that might not even be the correct approach).

Any ideas about how to achieve this? Or a better approach perhaps?

Thanks.


Solution

  • I belive that you are using try_files a bit wrong. What it does is

    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.

    You have one context with location ~* ^/jobs/([-a-z0-9]*)$ and another with location ~ ^/.+.php($|/)

    So you are finding files but not processing them through PHP as your processing is in another context.

    Therefore I belive you should add php processing in your try_files location.

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

    To not write same config for both /jobs and .php locations you can cut it to file and include like you do with include fastcgi_params;