проблема префикса mod_rewrite - PullRequest
0 голосов
/ 08 августа 2010

У меня возникли некоторые трудности с 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]

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

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

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

Но я не знаю, как маршрутизировать их с префиксом "app / public /"? Я попробовал:

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 Ответ

1 голос
/ 08 августа 2010

Попробуйте вместо этого:

/. 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]

Наконец, создайте index.php в ваших / app / public / ипоставьте диспетчер здесь:

<code><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));

?>

Теперь скажите попробуйте получить доступ:

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

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