Apache mod_重写前缀问题

Apache mod_重写前缀问题,apache,.htaccess,mod-rewrite,apache2,Apache,.htaccess,Mod Rewrite,Apache2,我在重写mod_时遇到了一些困难。我的目录结构(部分)是: 所以,正如您所看到的,所有静态文件都在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.exampl

我在重写mod_时遇到了一些困难。我的目录结构(部分)是:

所以,正如您所看到的,所有静态文件都在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]
另外,这个问题是,它只处理图像、Java脚本和样式表,而不处理所有其他文件

我知道有:

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]  
但我并不真正理解它是如何工作的,在我的示例中它是否总是工作的(可能是多个扩展)

谢谢

试试这个:

/.htaccess

RewriteEngine on
RewriteRule    ^$ app/public/    [L]
RewriteRule    (.*) app/public/$1 [L]
RewriteEngine on
RewriteRule    ^$ public/    [L]
RewriteRule    (.*) public/$1 [L]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
/app/.htaccess

RewriteEngine on
RewriteRule    ^$ app/public/    [L]
RewriteRule    (.*) app/public/$1 [L]
RewriteEngine on
RewriteRule    ^$ public/    [L]
RewriteRule    (.*) public/$1 [L]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
/app/public/.htaccess

RewriteEngine on
RewriteRule    ^$ app/public/    [L]
RewriteRule    (.*) app/public/$1 [L]
RewriteEngine on
RewriteRule    ^$ public/    [L]
RewriteRule    (.*) public/$1 [L]
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]
最后,在/app/public/中创建一个index.php,并在此处放置一个调度程序:


我得到500,在重写日志中,看起来他进入了不定式循环。但我不明白为什么这是最后一次,对吗?另外,如果我理解的很好,您正在将所有内容重定向到app/public,对吗?那index.php部分呢?对不起,如果我理解错了@抱歉,我没有粘贴其余的文件嘿,tnx,谢谢你的回答。现在,它似乎适用于静态文件,但是:1。对于空路径,它显示app/public 2。对于真正的请求,它崩溃了,并在日志中显示:script'/var/www/projects/petasite/app/public/index.php'未找到或无法统计,我尝试将.././index.php?url=$1放入,但它导致500。编辑:无法确定如何在注释中放置换行符:S@mfolnovich您需要在/app/public中创建一个充当dispatcher.Hmm的
index.php
,有没有办法避免其他index.php?如果没有,我想没有其他解决方案,所以tnx很多!:)