简体   繁体   中英

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.

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;

So ok, if your actual location directs to correct files - we're half way there. At this moment nginx is trying to download files - let's try to add another location directing those files to PHP parser - this one works for me:

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

Add this piece of code after your location and let me know if this works for you. You can read more about nginx with PHP here

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM