2010-06-29 7 views
3

Je cours PHP sur un serveur web Apache partagé. Je peux éditer le fichier .htaccess. J'essaye de simuler une structure de fichier qui n'est pas réellement là. Par exemple, je voudrais que l'URL: www.Stackoverflow.com/jimwiggly pour afficher réellement www.StackOverflow.com/index.php?name=jimwiggly je suis arrivé à mi-chemin en éditant mon fichier .htaccess selon les instructions de ce message: PHP: Serve pages without .php files in file structure:Simuler la structure de fichiers avec PHP

RewriteEngine on 
RewriteRule ^jimwiggly$ index.php?name=jimwiggly 

Cela fonctionne bien dans la mesure où la barre d'URL affiche toujours www.Stackoverflow.com/jimwiggly et les charges de page correct, cependant, tous mes liens relatifs restent inchangés. Je pourrais revenir en arrière et insérer <?php echo $_GET['name'];?> avant chaque lien, mais il semble qu'il pourrait y avoir une meilleure façon que cela. De plus, je soupçonne que toute mon approche pourrait être désactivée, devrais-je m'y prendre différemment?

Répondre

6

Je pense que la meilleure façon de le faire est d'adopter la manipulation d'url de style MVC avec l'URI et non les params.

Dans votre utilisation htaccess comme:

<IfModule mod_rewrite.c> 
    RewriteEngine On 
    #Rewrite the URI if there is no file or folder 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteRule ^(.*)$ index.php?/$1 [L] 
</IfModule> 

Ensuite, dans votre script PHP que vous souhaitez développer une petite classe pour lire l'URI et divisé en segments tels que

class URI 
{ 
    var $uri; 
    var $segments = array(); 

    function __construct() 
    { 
     $this->uri = $_SERVER['REQUEST_URI']; 
     $this->segments = explode('/',$this->uri); 
    } 

    function getSegment($id,$default = false) 
    { 
     $id = (int)($id - 1); //if you type 1 then it needs to be 0 as arrays are zerobased 
     return isset($this->segments[$id]) ? $this->segments[$id] : $default; 
    } 
} 

utilisation comme

http://mysite.com/posts/22/robert-pitt-shows-mvc-style-uri-access

$Uri = new URI(); 

echo $Uri->getSegment(1); //Would return 'posts' 
echo $Uri->getSegment(2); //Would return '22'; 
echo $Uri->getSegment(3); //Would return 'robert-pitt-shows-mvc-style-uri-access' 
echo $Uri->getSegment(4); //Would return a boolean of false 
echo $Uri->getSegment(5,'fallback if not set'); //Would return 'fallback if not set' 

Maintenant dans MVC Il habituellement comme http://site.com/controller/method/param mais dans une application non MVC style que vous pouvez faire http://site.com/action/sub-action/param

Espérons que cela vous aide à aller de l'avant avec votre application.

+0

+1 Ou mieux encore utiliser MVC;). –

+0

oui je l'aurais expliqué à lui mais il semblait qu'il était déjà à mi-chemin a jeté son application donc juste donné la meilleure réponse possible sans avoir à recoder toutes les applications. – RobertPitt

+0

@RobertPitt - Oui, j'ai créé ce site en 2004 et il a évolué avec le temps, si je devais le refaire, j'utiliserais un framework. Mais à partir de là où il est maintenant, quelque chose de plus bas comme celui-ci fonctionnera mieux. Merci beaucoup. –

Questions connexes