一些PHP url被下载而不是由Nginx执行。我有一个现有的web应用程序,这是运作良好。我的任务是在主应用程序的文件夹中添加附加的挂载应用程序。每个应用程序都有自己的前端控制器index.php
脚本。
对于这个设置,我在$document_root/app
中创建了符号链接,这些符号链接指向一个包含index.php
前端控制器的文件夹。
当我导航到大多数url时,一切正常,主应用程序前端控制器被执行,并且我得到了预期的结果。当我导航到一个不存在的应用程序时,我从nginx获得404 Not Found
,这是预期的。但是当我导航到其中一个应用程序时,浏览器会下载应用程序前端控制器。
root /my/web/root;
location / {
try_files $uri
/$server_name$uri
/shared$uri
/index.php$is_args$args;
}
location ~ [^/]'.php(/|$) {
disable_symlinks off;
fastcgi_split_path_info ^(.+'.php'b)(.*)$;
fastcgi_param SERVER_NAME $host;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME /index.php;
fastcgi_index index.php;
include fastcgi.conf;
fastcgi_pass php-fpm;
}
location ~ ^/app/([a-z-]+)(/.*)?$ {
try_files $uri
/app/$1/index.php$is_args$args
=404;
}
触发下载的URL: /app/my-app/
(exists)
URL where 404: /app/foo/
(不存在)
URL执行: /foo
.php
文件需要由location ~ [^/]'.php(/|$)
块处理。你有一个通用的文档根目录,这使事情变得更简单。
然而,看看这个关于location
指令的文档。
您将看到regex位置按照的顺序被视为,并且第一个匹配的位置将用于处理请求。
简而言之,如果您希望正确处理.php
文件,则需要将location ~ [^/]'.php(/|$)
块放在任何其他冲突的regex位置之前。