2009-06-16 5 views
2

Dans mon projet actuel, j'ai plusieurs répertoires: application (mes fichiers MVC, qui ne doivent pas être accessibles), images, css, et js. Effectivement je veux que toutes les demandes à images/css/js continuent sans changement, mais tous les autres que je souhaite appeler index.php/my/path. Mon .htaccess ressemble actuellement à ceci, et fait des ravages avec mon routage.Comment faire pour passer des demandes pas aller à des répertoires spécifiques à index.php/path?

Ce ne fonctionne pas comme des URL relatives commencent à empiler, tels que: example.com/blog/view/1/blog/view/2.

Lorsque je tente quelque chose comme, -

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    RewriteCond %{REQUEST_URI} !^/(index\.php|images|js|css|robots\.txt) 
    RewriteRule^index.php%{REQUEST_URI} [PT] 
</IfModule> 

Je reçois cette erreur à toute demande: No input file specified.


Comment puis-je forcer toutes les demandes non à mes répertoires d'appeler les listes blanches, non rediriger vers (affichage de meurtres de redirection, j'ai trouvé), index.php/path? IE, lorsque /blog/view/1 est demandé par le navigateur, .htaccess appelleindex.php/blog/view/1. Les fichiers de référence sur le site d'Apache ne sont pas trop clair sur la façon de faire ce genre de chose, ou, je suis juste en train de manquer le point de ce que je lis à propos de RewriteRule.

Et, je veux vraiment comprendre cela. Pourquoi votre réponse fonctionnera-t-elle? Pourquoi mes tentatives échouent-elles?

+0

Pour les gars ne me connaissant pas comme moi: "L'indicateur' L' indiquera à Apache d'arrêter le traitement des règles de réécriture pour cette requête. " parce que j'ai utilisé "PT" avant. –

Répondre

3

C'est ce que j'ai dans mon .htaccess pour mon cadre:

<IfModule mod_rewrite.c> 
    RewriteEngine on 

    #This will stop processing if it's images 
    RewriteRule \.(css|jpe?g|gif|png|js)$ - [L] 

    #Redirect everything to apache 
    #If the requested filename isn’t a file…. 
    RewriteCond %{REQUEST_FILENAME} !-f 
    #and it isn’t a folder… 
    RewriteCond %{REQUEST_FILENAME} !-d 

    RewriteRule ^(.*)$ index.php?$1 [L,QSA] 
    #L = (last - stop processing rules) 
    #QSA = (append query string from requeste to substring URL) 
</IfModule> 

Hope this helps.

PS: Peut-être que vous voulez supprimer les lignes pour arrêter la redirection si elle est un fichier ou un dossier;)

+0

Je souhaite que toutes les routes qui ne figurent pas dans ces répertoires dans la liste blanche soient explicitement placées dans "index.php/request/uri". Sinon, s'ils le souhaitent, ils peuvent voir mes contrôleurs. –

2

Antonio m'a aidé à obtenir sur la bonne voie, alors voici le .htaccess résultant:

<IfModule mod_rewrite.c> 
    RewriteEngine on 
    # skip if whitelisted directory 
    RewriteRule ^(images|css|js|robots\.txt|index\.php) - [L] 
    # rewrite everything else to index.php/uri 
    RewriteRule . index.php%{ENV:REQUEST_URI} [NE,L] 
</IfModule> 
0

Vous allez devoir faire cela en utilisant PHP. Par exemple, si vous voulez diviser votre URI en quelque chose comme domain.tld/contrôleur/action/param, vous pouvez ensuite utiliser le code PHP suivant comme début:

<?php 

// Filter URI data from full path 
$uri_string = str_replace($_SERVER['SCRIPT_NAME'], '', $_SERVER['REQUEST_URI']); 
$uri_string = trim($uri_string, '/'); // Make sure we don't get empty array elements 

// Retrieve URI data 
$uri_data = explode('/', $uri_string); 

Dans ce cas, uri_data de $ [0 ] est le contrôleur, $ uri_data [1] est l'action, et au-delà sont des paramètres. Notez que ce n'est pas une méthode infaillible, et ce n'est jamais une bonne idée de faire confiance à une entrée saisie par l'utilisateur comme celle-ci, donc vous devriez mettre en liste blanche les contrôleurs et les actions qui peuvent être utilisés. A partir de là, connaissant le contrôleur et ayant une structure de répertoire cohérente, vous pouvez require_once le bon contrôleur et appeler l'action en utilisant des variables variables.

+1

J'ai déjà le code qui gère l'analyse de l'URI, j'avais juste besoin de faire fonctionner .htaccess pour protéger mes répertoires sensibles et ranger un peu l'url. –

+0

Oh d'accord, j'ai mal compris votre question. Je pensais que vous essayiez de faire traiter l'URI en utilisant .htaccess. –

0

C'est ce que je l'utilise dans mon dossier .htaccess pour mon CMS:

Options -Indexes 

RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule ^(.+)$ index.php/$1 [NC,L] 

Et puis dans mon dossier index.php je:

$path_info = ''; 
$path_info = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : $path_info; 
$path_info = isset($_SERVER['ORIG_PATH_INFO']) ? $_SERVER['ORIG_PATH_INFO'] : $path_info; 

$request = explode('/', trim($path_info, '/')); 

// if $request[0] is set, it's the controller 
// if $request[1] is set, it's the action 
// all other $request indexes are parameters 

Hope this helps.

Questions connexes