我是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目录中的现有文件将覆盖任何路由。
如何让我的路由优先于网络目录中的请求文件?
答案 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服务器配置拒绝访问其他文件:
Apache(.htaccess
档案)(How to deny access to a file in .htaccess)
Nginx(http://www.queryadmin.com/1071/deny-access-sensitive-files-nginx/)