2010-08-07 5 views
0

У меня возникают некоторые трудности с mod_rewrite. Моя структура каталогов (часть) является:Проблема с префиксом mod_rewrite

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

Итак, как вы можете видеть, все статические файлы в приложении/общественности. Вот почему я хотел бы направить запросы как:

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] 

Кроме того, проблема с этим есть, он обрабатывает только изображения, сценарии и таблицы стилей, но не все другие файлы.

Я знаю, что есть:

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

Но, я не знаю, как пересылать их с приставкой «приложение/общественности /»? Я пробовал:

RewriteCond app/public/%{SCRIPT_FILENAME} !-f 
RewriteCond app/public/%{SCRIPT_FILENAME} !-d 

Но это не сработает! Я также попытался использовать RewriteBase, но это не сработало.

EDIT:
Я использую 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 в вашем /приложение/Public/ и поставить диспетчеру здесь:

<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] должно означать, что это последнее, не так ли? Кроме того, если я правильно понял, вы перенаправляете все на приложение/общественность, не так ли? Что относительно части index.php? Извините, если я понял неправильно! – mfolnovich

+0

@mfolnovich Извините, я не вставлял остальные файлы – Aillyn

+0

эй, tnx для вашего ответа. теперь он работает для статических файлов, но: 1. для пустого пути он отображает приложение/общедоступное 2. для реальных запросов он выходит из строя и в журнале говорится: script '/ var/www/проекты/petasite/app/public/index.php 'не найдены или не могут статировать, я попытался поставить ../../index.php?url=$1, но это вызвало 500. EDIT: не могу понять как помещать символы новой строки в комментарии: S – mfolnovich