mod_rewrite前缀问题

时间:2010-08-07 22:39:36

标签: apache .htaccess mod-rewrite apache2

我在使用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]  

但我真的不明白它是如何工作的,它总是在我的例子中工作(可能有多个扩展)?

谢谢!

1 个答案:

答案 0 :(得分: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]

最后,在 / app / public / 中创建 index.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