使用Symfony @Route覆盖文件请求

时间:2017-03-15 13:25:31

标签: php symfony url-routing

我是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目录中的现有文件将覆盖任何路由。

如何让我的路由优先于网络目录中的请求文件?

2 个答案:

答案 0 :(得分:2)

这是Web服务器配置问题。在基本的Symfony Web配置中,为了提供web /目录中包含的文件,Web服务器不会调用PHP或Symfony。如果找不到给定URL的文件,则Symfony应用程序只是后备。

现在的问题是:您使用什么作为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服务器技术,只需检查文档即可知道如何执行此操作。

答案 1 :(得分:1)

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.');
}

因此,您只能从localhost(开发环境)访问,但是从外部主机访问,这是拒绝访问。

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