使用宝塔nginx+php8.1 添加域名如aa.com,设置php版本为纯静态,运行start后一切都正常,
当在根目录(start.php同级)添加一个a.php文件后,浏览器访问aa.com/a.php 会变下载a.php的源码,
甚至访问start.php文件都会直接下载源码,
访问aa.com/.env 也会直接吧.env下载下来,
如何设置不让下载??而是访问403呢?
设置网站根目录到/public后也是一样,能访问public中的php文件直接下载,和程序根目录的start.php中的文件
去掉下面代理nginx的配置后,访问/public目录下文件,正常执行单个php文件
NG配置
location ^~ / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
#proxy_buffering off;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header Connection "";
if (!-f $request_filename){
proxy_pass http://127.0.0.1:16661;
}
}
config/static.php
return [
'enable' => true,
'middleware' => [ // Static file Middleware
app\middleware\StaticFile::class,
],
];
config/middleware.php
return [
'' => [
app\middleware\StaticFile::class,
]
];
app\middleware\StaticFile.php
<?php
/**
* This file is part of webman.
*
* Licensed under The MIT License
* For full copyright and license information, please see the MIT-LICENSE.txt
* Redistributions of files must retain the above copyright notice.
*
* @author walkor<walkor@workerman.net>
* @copyright walkor<walkor@workerman.net>
* @link http://www.workerman.net/
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace app\middleware;
use Webman\MiddlewareInterface;
use Webman\Http\Response;
use Webman\Http\Request;
/**
* Class StaticFile
* @package app\middleware
*/
class StaticFile implements MiddlewareInterface
{
public function process(Request $request, callable $next): Response
{
// Access to files beginning with. Is prohibited
if (strpos($request->path(), '/.') !== false) {
return response('<h1>403 forbidden</h1>', 403);
}
/** @var Response $response */
$response = $next($request);
// Add cross domain HTTP header
/*$response->withHeaders([
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Credentials' => 'true',
]);*/
return $response;
}
}
config/app.php
<?php
use support\Request;
return [
'debug' => getenv('DEBUG')?:false,
'error_reporting' => E_ALL,
'default_timezone' => 'Asia/Shanghai',
'request_class' => Request::class,
'public_path' => base_path() . DIRECTORY_SEPARATOR . 'public',
'runtime_path' => base_path(false) . DIRECTORY_SEPARATOR . 'runtime',
'controller_suffix' => 'Controller',
'controller_reuse' => false,
];
workerman 项目 部署 不需要指定目录 指定代理地址即可
文档:
https://www.workerman.net/doc/webman/others/nginx-proxy.html
看看文档吧 哥哥
根据这个设置了,才发现的这个问题
ng 配置加个这玩意儿 用来过滤php 文件 下载的问题
也可以使用
这样设置根目录访问403生效了,
请求地址是什么 正常访问应该不会直接访问php文件吧
原生+ workerman 混合嘛 ? 如果是这样的话 需要对目录内的php 文件做权限规划
根目录访问不到了, 但是设置运行目录public后 域名/a.php 还是会直接下载, 这个不要紧不放文件到这个目录就好。单独写一些php脚本放cli里处理数据用的
完整配置发一下吧 感觉有幺蛾子
location ^~ / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_buffering off;
1、nginx设置的根目录必须是public
2、至于访问.php文件就下载,这个和webman没关系,是nginx直接将php文件发给了浏览器,请求还没到webman那边。
我记得webman默认不支持.php文件的访问,为什么你要把.php文件放到public下?
设置public了,也是一样的,访问start.php也是可以访问到直接下载了,当去掉nginx的代理设置,php文件就可以正常执行,当运行的就不是webman的程序了
是的,webman默认不支持.php文件的访问,我也不需要访问,我放到程序根目录的,发现也能被访问到,访问的形式就是直接把php文件下载下来了,然后才设置到public,结果也一样
public 下面一般都是静态文件,ng当成静态下载了吧
public根目录的上级目录, 也就是start.php同级,这个程序的根目录,设置了public根目录,还是能访问,域名/start.php,也直接把start.php下载了,根目录下面的文件访问(txt,图片等不会)其他都会直接下载
锕!意思是跨过设置的根目录直接访问外面的文件吗
这样的话应该是ng的配置问题了
嗯, 宝塔面板里设置了运行目录/public,我传了一个/public/a.php文件, 访问域名/a.php 直接下载了,访问根目录域名/start.php也下载了,去掉NG的配置后,访问域名/a.php正常了,但是不能访问webman的程序了
我也用的是宝塔,正常使用,你删除站点新建一个看看
也是一样,php start.php start 后访问就直接下载了
我怀疑宝塔配置的问题!!
可能是 不是运行的fpm环境, 去掉webman的代理直接运行又正常