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

标签 php nginx

一些 PHP URL 正在下载,而不是由 Nginx 执行。我有一个运行良好的现有网络应用程序。我的任务是在主应用程序的文件夹中添加其他已安装的应用程序。每个应用程序都有自己的前端 Controller index.php 脚本。

对于此设置,我在 $document_root/app 内创建了符号链接(symbolic link),并且符号链接(symbolic link)指向包含 index.php 前端 Controller 的文件夹。

当我导航到大多数 URL 时,一切正常,主应用程序前端 Controller 被执行,并且我得到了预期的结果。当我导航到不存在的应用程序时,我从 nginx 收到 404 Not Found,这是预期的。但是当我导航到其中一个应用程序时,浏览器会下载应用程序前端 Controller 。

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/ (存在)
发生 404 错误的 URL: /app/foo/ (不存在)
执行的URL: /foo

最佳答案

.php 文件需要由 location ~ [^/]\.php(/|$) block 处理。您有一个公共(public)文档根,这使事情变得更简单。

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

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

简而言之,如果您愿意,您需要将 location ~ [^/]\.php(/|$) block 放在任何其他冲突的正则表达式位置之前您的 .php 文件得到正确处理。

关于php - nginx 将一些 PHP URL 作为下载而不是执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38085924/

相关文章:

php - 过滤递归数组并仅删除 NULL 值

php - 为什么一个 MySQL 数据库接受 DateTime 而另一个不接受?

php - mysql_escape_string 图像 url 问题

ruby-on-rails-3 - 导轨 : https://for a specific URL

python - 使用 RTMP 协议(protocol)将视频文件流式传输到使用 Python 的 rtmp 服务器

PHP/MySQL : get unlimited data

php - 使用 AJAX 将变量传递给 PHP 数组

gzip - 如何检查 nginx gzip_static 模块是否正常工作?

ruby-on-rails-3 - 在Nginx + Unicorn上加载时出现严重的网关错误(Rails 3应用)

php - Laravel Valet php-fpm已经在代客 socks 上听了