nginx将一些PHP url作为下载而不是执行
一些PHP URL正在下载,而不是由Nginx执行。我有一个运行良好的现有web应用程序。我的任务是在主应用程序的文件夹中添加其他装入的应用程序。每个应用程序都有自己的前端控制器nginx将一些PHP url作为下载而不是执行,php,nginx,Php,Nginx,一些PHP URL正在下载,而不是由Nginx执行。我有一个运行良好的现有web应用程序。我的任务是在主应用程序的文件夹中添加其他装入的应用程序。每个应用程序都有自己的前端控制器index.phpscript 对于这个设置,我在$document\u root/app中创建了符号链接,符号链接指向一个包含index.php前端控制器的文件夹 root /my/web/root; location / { try_files $u
index.php
script
对于这个设置,我在$document\u root/app
中创建了符号链接,符号链接指向一个包含index.php
前端控制器的文件夹
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时,一切正常,主应用程序前端控制器被执行,我得到了预期的结果。当我导航到一个不存在的应用程序时,我会从nginx获得404notfound
,这是意料之中的。但当我导航到其中一个应用程序时,浏览器会下载应用程序前端控制器
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/
(存在)404s的URL:
/app/foo/
(不存在)执行的URL:
/foo
.php
文件需要由位置~[^/]\.php(/|$)
块处理。您有一个通用的文档根,这使事情变得更简单
但是,关于位置
指令
您将看到正则表达式位置按顺序被视为,第一个匹配位置将用于处理请求
简而言之,如果希望正确处理
.php
文件,则需要将位置~[^/]\.php(/|$)
块放在任何其他冲突的正则表达式位置之前 尝试将php的位置设置为location~[^/]\.php(/|$)
行为无变化。显式../app/index.php
URL执行,隐式../app/
URL下载,非app URL执行。您上一个try\u文件
指令中有错误。移除=404
。/app/$1/index.php$is_args$args
元素必须是行中的最后一个元素。请参阅以了解详细信息。有关为什么=404
会破坏东西的更多信息:在“当前上下文”中提供列表中的“第一个找到的文件”。对于/app/my app
,该上下文是位置^/app/([a-z-]+)(/.*)$
块,它不处理PHP-因此nginx发送原始/app/my app/index.PHP
源文件。但是,try_文件列表中的最后一项被重定向到。当/app/$1/index.php
是最后一个时,它被重定向到位置~[^/]\.php(/| s)
块,该块处理php-因此在删除=404
后,my app front控制器运行。