站点部署成功后,浏览器访问文件自动变成下载源码BUG?

z

问题描述

使用宝塔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,
];
322 4 0
4个回答

SillyDog

workerman 项目 部署 不需要指定目录 指定代理地址即可
文档:
https://www.workerman.net/doc/webman/others/nginx-proxy.html

  • SillyDog 2024-02-21

    看看文档吧 哥哥

  • z 2024-02-21

    根据这个设置了,才发现的这个问题

  • SillyDog 2024-02-21

    ng 配置加个这玩意儿 用来过滤php 文件 下载的问题

    
        location ~ \.php(.*)$ {
            return 403 "<h1>403 forbidden</h1>";
        }
  • SillyDog 2024-02-21

    也可以使用

        location ~ \.php(.*)$ {
            deny  all;
        }
  • z 2024-02-21

    这样设置根目录访问403生效了,

  • SillyDog 2024-02-21

    请求地址是什么 正常访问应该不会直接访问php文件吧

  • SillyDog 2024-02-21

    原生+ workerman 混合嘛 ? 如果是这样的话 需要对目录内的php 文件做权限规划

  • z 2024-02-21

    根目录访问不到了, 但是设置运行目录public后 域名/a.php 还是会直接下载, 这个不要紧不放文件到这个目录就好。单独写一些php脚本放cli里处理数据用的

  • SillyDog 2024-02-21

    完整配置发一下吧 感觉有幺蛾子

  • z 2024-02-21

    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;
        }
    } 其他ng都是默认的
keytehu

1、nginx设置的根目录必须是public
2、至于访问.php文件就下载,这个和webman没关系,是nginx直接将php文件发给了浏览器,请求还没到webman那边。

我记得webman默认不支持.php文件的访问,为什么你要把.php文件放到public下?

  • z 2024-02-21

    设置public了,也是一样的,访问start.php也是可以访问到直接下载了,当去掉nginx的代理设置,php文件就可以正常执行,当运行的就不是webman的程序了

  • z 2024-02-21

    是的,webman默认不支持.php文件的访问,我也不需要访问,我放到程序根目录的,发现也能被访问到,访问的形式就是直接把php文件下载下来了,然后才设置到public,结果也一样

TM

public 下面一般都是静态文件,ng当成静态下载了吧

  • z 2024-02-21

    public根目录的上级目录, 也就是start.php同级,这个程序的根目录,设置了public根目录,还是能访问,域名/start.php,也直接把start.php下载了,根目录下面的文件访问(txt,图片等不会)其他都会直接下载

  • TM 2024-02-21

    锕!意思是跨过设置的根目录直接访问外面的文件吗

  • TM 2024-02-21

    这样的话应该是ng的配置问题了

  • z 2024-02-21

    嗯, 宝塔面板里设置了运行目录/public,我传了一个/public/a.php文件, 访问域名/a.php 直接下载了,访问根目录域名/start.php也下载了,去掉NG的配置后,访问域名/a.php正常了,但是不能访问webman的程序了

  • TM 2024-02-21

    我也用的是宝塔,正常使用,你删除站点新建一个看看

  • z 2024-02-21

    也是一样,php start.php start 后访问就直接下载了

yuyu

我怀疑宝塔配置的问题!!

  • z 2024-02-21

    可能是 不是运行的fpm环境, 去掉webman的代理直接运行又正常

🔝