2010-08-07 80 views
0

我遇到了一些mod_rewrite问题。我的目录结构(的一部分)是:mod_rewrite前缀问题

index.php 
.htaccess 
app 
    controllers 
    models 
    views 
    ... 
    public 
    javascripts 
    stylesheets 
    foo 
     bar 

所以,你可以看到,所有静态文件是在app /公众。这就是我想的路线一样请求的原因:

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] 

此外,这个问题是,它只处理图像,JavaScript和样式表,但不是所有其他文件。

我知道有:

RewriteCond %{SCRIPT_FILENAME} !-f 
RewriteCond %{SCRIPT_FILENAME} !-d 

但是,我不知道用前缀“应用程序/公/”如何路由呢?我试过了:

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] 

但我实在不明白它是如何工作的?它总是在我的例子(也许多个扩展名)工作?

谢谢!

回答

1

试试这个:

/.htaccess

RewriteEngine on 
RewriteRule ^$ app/public/ [L] 
RewriteRule (.*) app/public/$1 [L] 

/app/.htaccess

RewriteEngine on 
RewriteRule ^$ public/ [L] 
RewriteRule (.*) public/$1 [L] 

/app/public/.htaccess

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

最后,创建一个索引。PHP/应用/公/,并把此调度员:

<pre> 
<?php 

function dispatch($action, $request) { 

    echo 'action: ' . $action; 
    echo "\nparameters: " ; 
    print_r($request); 
} 

$fragments = explode('/', $_GET['url']); 
dispatch($fragments[0], array_slice($fragments, 1)); 

?> 
</pre> 

说现在尝试访问:

# these will go through php 
/controller/action 
/post/create 
/post/delete/1 

# these are static files 
/stylesheets/ 
/foo/bar/myfile.txt 
+0

我得到500,并在重写日志,它看起来像他得到了在不定式循环。但我不明白为什么,[L]应该是最后一个,对吗? 另外,如果我理解的很好,您将所有内容重定向到app/public,对吧?怎么样index.php部分?对不起,如果我理解错了! – mfolnovich 2010-08-08 18:35:50

+0

@mfolnovich对不起,我没有粘贴其他的文件 – Aillyn 2010-08-08 18:39:50

+0

嘿,tnx为您的答案。现在,它似乎对静态文件的工作,但: 1.空路径,它会显示应用程序/公共 2.真正的需求,它崩溃和日志,它说: 脚本“在/ var/WWW /项目/ petasite /应用程序/公共/ index.php'未找到或无法统计,我试图把../../index.php?url=$1,但它造成500. 编辑:无法弄清楚如何在评论中添加换行符:S – mfolnovich 2010-08-08 18:45:10