我的用户想要在 PHP Web 应用程序的 CMS 后端上传大型文件 (50-100MB)。我可以在此虚拟主机中全局调整PHP 的upload_max_filesize
和post_max_size
设置,但我担心这会使拒绝服务攻击变得比必要的更容易。
理论上,这两个设置可以按目录进行调整(在虚拟主机配置文件中或通过 .htaccess 文件),而我只需要管理区域中较大的值。不幸的是,此应用程序在 Web 根目录中只有一个 start.php(单一入口点),所有其他 PHP 文件都从那里包含。这似乎使得按目录进行设置变得不可能。我尝试将 CMS 中使用的路径与 <Location> 匹配,但即使路径正确,php_value 指令也没有任何效果。
<LocationMatch ^/admin>
php_value upload_max_filesize 100MB
php_value post_max_size 100MB
</LocationMatch>
(mod_rewrite 用于将类似的路径转换为/admin/content/bla
,/start.php?_p=/admin/content/bla
这就是为什么“start.php”文件名没有出现在上面的表达式中。)
有什么方法可以实现这个功能吗?我也愿意接受其他建议;例如,在我们的案例中,基于 IP 的设置可能是可行的。
短暂性脑缺血。
答案1
Apache 似乎无法做到这一点。但是,您可以为 Apache 或 php-fpm 全局设置较高的限制,并使用带有 proxy_pass 或 fastcgi_pass 的 nginx,并在单独的位置使用 nginx client_max_body_size 指令设置每个 URL 的限制:
location / {
client_max_body_size 1M;
try_files NOT_EXISTS @proxy;
}
location = /upload.php {
client_max_body_size 100M;
try_files NOT_EXISTS @proxy;
}
location @proxy {
proxy_pass http://localhost:9000/; #Apache listening on port 9000;
# other proxy directives may be needed, e.g. to set Host headers
}
答案2
首先尝试使用‘/’是否可行:
<LocationMatch ^/>
如果是,请尝试以下其中之一:
<LocationMatch ^/start.php\?_p=/admin>
<LocationMatch ^/start.php?_p=/admin>
<LocationMatch _p=/admin>
另请注意:
<Location> 部分按照它们在配置文件中出现的顺序进行处理,在读取部分和 .htaccess 文件之后,以及在部分之后。