【问题标题】:Override file request with Symfony @Route使用 Symfony @Route 覆盖文件请求
【发布时间】:2017-08-06 06:33:42
【问题描述】:

我是 Symfony 的新手,我正在做一个测试项目来提高我的知识。实际上,我正在学习Routing,我想做的是在请求扩展名为.disabled 的文件时拒绝访问。我说的是放在web 目录中的文件。因此,例如,位于web/config.php.disabled 的文件无法执行/下载。

然后我创建了一条这样的路线

/**
 * @Route("{req}disabled", name="denyAccess", requirements={"req"=".+"})
 */
public function denyAccessAction(Request $request, $req)
{
    return new Response('Access denied');
}

当我请求一个不存在的文件(例如http://my.website/file.php.disabled)时工作正常。但是当我请求现有文件时,该路径不起作用,我可以毫无问题地下载该文件。所以我猜请求放置在 web 目录中的现有文件将覆盖任何路由。

我怎样才能让我的路由比 web 目录中请求的文件具有更高的优先级?

【问题讨论】:

    标签: php symfony url-routing


    【解决方案1】:

    这是一个 Web 服务器配置问题。在基本的 Symfony Web 配置中,为了提供包含在 web/ 目录中的文件,您的 Web 服务器不会调用 PHP 或 Symfony。您的 Symfony 应用程序仅在未找到给定 URL 的文件时作为备用。

    现在的问题是:您使用什么作为 Web 代理? Nginx、Apache、HAProxy?

    如果您使用的是 Nginx,您的配置中应该有这样的内容:

    location / {
        try_files $uri /app_dev.php$is_args$args;
    }
    
    location ~ ^/app_dev\.php(/|$) {
        fastcgi_pass unix:/var/run/php/phpX.X-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        fastcgi_param DOCUMENT_ROOT $realpath_root;
    }
    

    在第一个块中,try_files 完全按照我告诉你的那样:首先它会尝试返回与给定 $url 关联的文件,然后如果找不到,它会使用相同的路由回退到 app_dev.php参数。然后它被第二个块捕获,它将请求转发给 PHP。

    因此,对于您的特定用例,我建议您添加一个块来拒绝会请求带有“.disabled”文件的用户。在 Nginx 中,这很容易做到:

    location ~ \.disabled/?$ {
        return 403;
    }
    

    对于其他 Web 服务器技术,只需查看文档以了解如何执行此操作。

    【讨论】:

      【解决方案2】:

      web/ 是一个资源文件夹,Symfony 无法通过路由系统控制这个文件夹(除非 URI 不存在)。

      如果你试图拒绝访问config.php,这已经在他内部完成了:

      if (!isset($_SERVER['HTTP_HOST'])) {
          exit('This script cannot be run from the CLI. Run it from a browser.');
      }
      
      if (!in_array(@$_SERVER['REMOTE_ADDR'], array(
          '127.0.0.1',
          '::1',
      ))) {
          header('HTTP/1.0 403 Forbidden');
          exit('This script is only accessible from localhost.');
      }
      

      所以,你只能从本地主机(开发环境)访问,但从外部主机,这拒绝访问。


      另一方面,您可以使用 Web 服务器配置拒绝访问其他文件:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-27
        • 2014-02-17
        • 2020-01-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-28
        • 1970-01-01
        相关资源
        最近更新 更多