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;
一样包含
我在多个目录(/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;
一样包含