2010-08-07 6 views
0

J'ai des problèmes avec mod_rewrite. Ma structure d'annuaire (partie) est:problème de préfixe mod_rewrite

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

Donc, comme vous pouvez le voir, tous les fichiers statiques sont app/public. Voilà la raison pour laquelle je voudrais demande la route comme:

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 

Si ce fichier n'existe pas, alors il devrait route vers index.php, comme:

http://www.example.com/news/show/42 => index.php 
(Because file app/public/news doens't exist) 


Ainsi, c'est mon .htaccess actuel, mais je pense que cela peut être fait de manière plus élégante.

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] 

En outre, problème avec celui-ci est, il ne gère que les images, javascripts et feuilles de style, mais pas tous les autres fichiers.

Je sais qu'il est:

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

Mais, je ne sais pas comment les acheminer avec le préfixe "app/public /"? J'ai essayé:

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

Mais cela ne fonctionne pas! J'ai également essayé d'utiliser RewriteBase, mais cela n'a pas fonctionné.

EDIT:
J'utilise mod_expires, et je voudrais vraiment automatiser des demandes similaires:

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 

Donc, comme vous pouvez le voir, je voudrais avoir le numéro facultatif entre le nom de fichier et l'extension , et ce nombre devrait être ignoré (il est seulement utilisé pour les futures expirations).

Auparavant, j'ai trouvé:

RewriteRule ^(.*)\.(\d+)(_m_\d+)?\.([^\.]+)$ $1.$4 [QSA] 

Mais je ne comprends pas vraiment comment il fonctionne et travaille-t-il toujours dans mon exemple (plusieurs extensions peut-être)?

Merci!

Répondre

1

Essayez ceci:

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

Enfin, créez un index .php dans votre /app/public/ et mettre un répartiteur ici:

<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> 

disent maintenant essayez d'accéder à:

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

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

je reçois 500, et dans le journal de réécriture, on dirait qu'il a en boucle infinitive. Mais je ne vois pas pourquoi, [L] devrait signifier que c'est la dernière, non? Aussi, si j'ai bien compris, vous redirigez tout vers l'application/public, n'est-ce pas? Qu'en est-il de la partie index.php? Désolé si j'ai mal compris! – mfolnovich

+0

@mfolnovich Désolé, je n'ai pas coller le reste des fichiers – Aillyn

+0

hey, tnx pour votre réponse. maintenant, il semble fonctionner pour les fichiers statiques, mais: 1. pour le chemin vide, il affiche app/public 2. pour les demandes réelles, il se bloque et dans le journal, il est dit: script '/ var/www/projets/petasite/app/public/index.php 'pas trouvé ou incapable de stat, j'ai essayé de mettre ../../index.php?url=$1, mais il a causé 500. EDIT: ne peut pas comprendre comment mettre des sauts de ligne dans les commentaires: S – mfolnovich