.htaccess将具有某些路径的文件重定向到另一个目录

时间:2011-06-11 23:22:28

标签: regex .htaccess

这可能看起来有点基础,这里有很多问题,但我有一个小的.htaccess问题(mod_rewrite)。

我正在研究PHP的MVC框架(和所有其他人一样......)并且所有流量都通过index.php,然后路由到所需的控制器和方法。一切顺利。结构大致如下:

  • 应用
    1. 控制器
    2. 模型
    3. 视图
  • 缓存
  • 框架
  • 公共
    1. 资产
    2. IMG
    3. CSS
    4. JS​​
  • 的index.php
  • 的.htaccess

对于像myapp.com/css/这样的网址,我需要加载CSS控制器,索引功能。但对于像myapp.com/css/style.css这样的网址,我需要从public / css /目录中获取文件

我讨厌写/ public /我希望包含的每个文件,所以基本上我需要将所有流量重定向到/ public /如果它是一个实际文件并保留所有其他URL的正常重写规则。我打算在生产中使用它,让前端开发人员以他们通常的方式执行他们的工作会更容易,然后只需将粘贴内容复制到通过CSS修改路径等的内部版本。

我想出了这个:

RewriteEngine on

RewriteRule ^(img|css|js|assets)/(.*).([a-z]{3})$ public/$1/$2 [L,NC]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L,QSA]

但它有一些明显的缺陷。我不介意必须在第一个正则表达式中设置目录,但检查路径是一个文件的方式似乎相当不可靠。使用RewriteCond检查它是一个文件由于某种原因不起作用我认为这个方法可能会失败的网址,如myapp.com/img/this-is-actually-an-article.aaa当然,扩展也可以更长超过3个字符,我需要检查这是否安全。

最好的方法是什么?你们是怎么做到的?或者从一开始就是一种错误的做法?

1 个答案:

答案 0 :(得分:1)

-f无效,因为请求的文件为/css/style.css,而磁盘上的文件为/public/css/style.css

我认为声明一些你不能在你的应用程序中使用的预定义命名空间没有问题(比如img,css,js,assets)。

最终,我认为您将转向框架的插件无法再决定其资源位置的情况,框架应该为它们决定,甚至可能为它们加载它。这解决了您当前遇到的所有问题,因为没有任何插件代码需要了解有关URL的任何信息。无论你的改写策略如何,我认为这是一个值得追求的东西。