我在多个目录(/jobs/marketing/,/jobs/content/等)中有.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重定向到它。我想我需要用另一个位置块找到正确的文件,但我似乎什么都不起作用(这甚至可能不是正确的方法)。
关于如何实现这一点,有什么想法吗?或者一个更好的方法?
谢谢。
我认为您使用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位置编写相同的配置,您可以将其剪切到文件中,并像使用include-fastcgi_params一样进行include;
好吧,如果您的实际位置指向正确的文件,我们已经完成了一半。目前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;
}
在你的位置后添加这段代码,让我知道这是否适合你。你可以在这里阅读更多关于nginx和PHP的信息