Php NGINX:阻止下载脚本文件并改为执行

Php NGINX:阻止下载脚本文件并改为执行,php,nginx,Php,Nginx,我看到这个问题被问了1001多次,坦率地说,我不相信这在nginx和PHP设置中是可能的。我必须在生产中修复一个遗留应用程序,nginx和php-fpm在同一个机器上运行,这意味着它们共享这个目录 我的情况不同于99.999%的设置,因为我只允许提供类似静态的站点;但是,允许加载2或3个小的PHP脚本页面我不想允许任何PHP运行时的执行,除非已匹配显式URI。 不幸的是,如果有人“猜测”服务器上的php文件,它会下载 一条毯子不能固定温度 我有一个我认为是解决办法。但我需要一个比我更有nginx

我看到这个问题被问了1001多次,坦率地说,我不相信这在nginx和PHP设置中是可能的。我必须在生产中修复一个遗留应用程序,nginx和php-fpm在同一个机器上运行,这意味着它们共享这个目录

我的情况不同于99.999%的设置,因为我只允许提供类似静态的站点;但是,允许加载2或3个小的PHP脚本页面我不想允许任何PHP运行时的执行,除非已匹配显式URI。

不幸的是,如果有人“猜测”服务器上的php文件,它会下载

一条毯子不能固定温度 我有一个我认为是解决办法。但我需要一个比我更有nginx经验的人来验证这一点,因为它是一个敏感的网站。我通过完全忽略PHP中的任何内容来做到这一点:

#
# case-insensitive match of anything *.php
location ~* \.php {
    # never allow a single .php page to run, ever.
    # no parsing, no lookup, nada.  stop dead in tracks.
    return 404;
}
如果没有此块,nginx将发送下面的/var/www/cat videos/cats.php文件作为下载

从Nginx下载的根本原因 我发现nginx下载这些文件是因为(drumroll-从来没有人解释过为什么会发生这种情况-drumroll):

  • nginx.conf已将
    default_type
    设置为
    application/octet stream
    (也称下载)。将其更改为,例如,
    text/plain
    显示PHP,而不是下载它。这证明了这个配置变量是它的一部分
  • nginx将为
    根目录
    中的所有文件提供服务,而不考虑其类型。如果没有匹配的mime类型,它将使用上面的
    默认类型
就在这里。如果您不希望服务,请不要将文件放在nginx可以看到的地方!(相反,将所有php文件移动到
root
指令之外的另一个目录,并将fastcgi配置为在其他地方进行对话)。例如,
/var/www/mysite scripts only/
而不是
/var/www/mysite static version/

NGINX安全最佳实践? php和静态站点的最佳实践是什么?是否将脚本移动到其他目录?操作两台不同的服务器,并使用
proxy\u pass

我认为最好将所有脚本文件(python、php、ruby等——所有类型的脚本)与静态文件完全分离。并为类型设置特定的
location
指令,您可以通过
proxy\u pass
fastcgi
passer
或其他类似方式在不同目录中控制脚本访问

默认情况下,这允许nginx以静态的方式服务于静态站点中的任何内容

不,我不是说“只需将X添加到您的
位置
,fastcgi将阻止下载”—不。我需要完全保证这不会再次发生。将脚本文件从静态文件中分离出来似乎是唯一100%无误的方法,因为nginx只想服务于其根目录中的所有内容

可能会有更具体的
位置
覆盖或url重写,也会阻止所有请求在nginx中通过。也有可能在
位置
中使用额外的
指令-但据我所知,这通常是不赞成的。但是,解决这一问题超出了范围和时间

什么有效 记录在案的是,我以前的nginx配置阻止了php下载:

  • Nginx 1.10
  • php fpm 7.0
  • 使用docker,不要触摸
    /etc/nginx/conf.d/default.conf
下面是相关的
/etc/nginx/nginx.conf
。(不使用
conf.d/*
,没有关系)

那是旧的配置。此后,我将所有脚本从静态目录中分离出来,并将fastcgi配置为与另一个目录对话,如:

fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only/cats.php;
希望保持其动态性的用户可能希望将其更改为:

# don't use $document_root prefix on the path, move scripts elsewhere
fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only$fastcgi_script_name;

谢谢

我已经在nginx和这个设置上与更多的用户进行了交谈,除了我在原始问题中所描述的方式之外,似乎没有其他方式了

他们说使用不同的根目录从静态文件中分离脚本是最好的方法,我已经这样做了


因此,我自己的问题得到了回答,因为此时它确实应该是一个Wiki。

为什么
python
tag?为什么
ruby
?@leovp如果您的nginx
root
目录中有一个
file.py
file.rb
,希望它不会被提供-您没有。如果没有与之匹配的
位置
,则将提供该服务。这个问题适用于所有配置。但这是
nginx
配置问题。修复此问题不需要
python
/
ruby
代码。
# don't use $document_root prefix on the path, move scripts elsewhere
fastcgi_param SCRIPT_FILENAME /var/www/mysite-scripts-only$fastcgi_script_name;