mod_rewrite不从子文件夹重定向到控制器(Symfony 2)

时间:2015-11-16 06:16:47

标签: php apache .htaccess symfony mod-rewrite

美好的一天。 我在项目中有以下结构:

/project
   ...
   /web
      /uploads
          .htaccess
          test.txt
      .htaccess // Symfony htaccess

我想将所有请求重定向到/uploads/test.txt到一个单独的控制器,该控制器决定用户是否有权读取test.txt文件。

/web/uploads/.htaccess的内容如下:

RewriteEngine On
Options +FollowSymLinks
RewriteRule ^(.*)uploads/test.txt$ /app_dev.php/uploader/test [PT,L,QSA]

问题是这个htaccess文件永远不会将请求重定向到控制器操作(上传器/测试点到右控制器和操作)。 它只返回uploads/test.txt文件。日志显示文件只是通过启用/禁用PT标志传递。

[Mon Nov 16 07:40:40.823485 2015] [rewrite:trace3] [pid 27811] mod_rewrite.c(468): [client 192.168.142.1:61956] 192.168.142.1 - - [test.lh/sid#b6329d90][rid#b63fe058/initial] [perdir /var/www/test/web/uploads/] applying pattern '^(.*)uploads/test.txt$' to uri 'test.txt'
[Mon Nov 16 07:40:40.823500 2015] [rewrite:trace1] [pid 27811] mod_rewrite.c(468): [client 192.168.142.1:61956] 192.168.142.1 - - [test.lh/sid#b6329d90][rid#b63fe058/initial] [perdir /var/www/test/web/uploads/] pass through /var/www/test/web/uploads/test.txt

那么,为什么它没有重定向到控制器?

1 个答案:

答案 0 :(得分:0)

AFAIR,如果目标文件存在(规则指向重写前的目录/文件),mod_rewrite将忽略该规则。如果您想通过mod_rewrite捕获libs时想要传递/dir,那肯定会发生这种情况。这是不可能的,AFAIK。

无论如何 - 如果您要过滤权限,请将/dir文件夹移到upload之外。

然后:创建具有此结构的路线并使用:http://symfony.com/doc/current/components/http_foundation/introduction.html#serving-files

这是实现这一目标的最可靠方法。到目前为止,越来越多的人正在将重写规则直接转移到应用程序。那没关系。特别是如果您的HTTPd支持web。那么开销很小。