nginx将一些PHP URL作为下载而不是执行

时间:2016-06-28 20:41:59

标签: php nginx

正在下载一些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;
}

触发下载的网址 /app/my-app/ (存在)
404s的网址 /app/foo/ (不存在)
执行的网址: /foo

1 个答案:

答案 0 :(得分:3)

.php块需要处理location ~ [^/]\.php(/|$)文件。你有一个通用的文档根目录,使事情更简单。

但是,look at this document关于location指令。

您会看到正则表达式位置被视为按顺序,第一个匹配位置将用于处理请求。

简而言之,如果您希望正确处理location ~ [^/]\.php(/|$)文件,则需要将.php阻止置于任何其他冲突的正则表达位置之前。