【发布时间】:2010-08-09 02:55:26
【问题描述】:
我在使用 mod_rewrite 时遇到了一些困难。我的目录结构(部分)是:
index.php
.htaccess
app
controllers
models
views
...
public
javascripts
stylesheets
foo
bar
所以,如您所见,所有静态文件都在 app/public 中。这就是我想路由请求的原因:
http://www.example.com/images/logo.png => app/public/images/logo.png
http://www.example.com/javascripts/app.js => app/public/javascripts/app.js
http://www.example.com/uploads/blog/something => app/public/uploads/blog/something
如果该文件不存在,那么它应该路由到 index.php,例如:
http://www.example.com/news/show/42 => index.php
(Because file app/public/news doens't exist)
所以,这是我当前的 .htaccess,但我认为它可以以更优雅的方式完成。
RewriteEngine on
RewriteRule (png|jpg|gif|bmp|ico)$ app/public/images/$1/$2.$3 [L]
RewriteRule ([^/.]+).js$ app/public/javascripts/$1.js [L]
RewriteRule ([^/.]+).css$ app/public/stylesheets/$1.css [L]
RewriteRule ^(.*)$ index.php [NC,L,QSA]
另外,这个问题是,它只处理图像、javascripts 和样式表,而不是所有其他文件。
我知道有:
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
但是,我不知道如何使用前缀“app/public/”路由它们?我试过了:
RewriteCond app/public/%{SCRIPT_FILENAME} !-f
RewriteCond app/public/%{SCRIPT_FILENAME} !-d
但它不起作用!我也尝试过使用 RewriteBase,但没有成功。
编辑:
我正在使用 mod_expires,我真的很想自动执行以下请求:
http://www.example.com/images/logo.42.png => app/public/images/logo.png
http://www.example.com/javascripts/app.42.js => app/public/javascripts/app.js
因此,如您所见,我希望在文件名和扩展名之间有可选数字,并且应该忽略该数字(它仅用于将来过期)。
以前,我发现:
RewriteRule ^(.*)\.(\d+)(_m_\d+)?\.([^\.]+)$ $1.$4 [QSA]
但我真的不明白它是如何工作的,它在我的示例中是否总是有效(可能有多个扩展)?
谢谢!
【问题讨论】:
标签: apache .htaccess mod-rewrite apache2