我在多个目录(/ 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重定向到它。我想我需要以某种方式用另一个位置块捕获正确的文件,但我似乎没有任何工作(这可能不是正确的方法)。
有关如何实现这一目标的任何想法?或者更好的方法呢?
感谢。
答案 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的更多信息