2008-12-28 4 views
19

Je viens d'un arrière-plan Java et avec toute technologie basée sur les servlets, il est trivial de mapper une plage d'URL (par exemple/reports/,/secure/ .do) à une servlet spécifiée. Maintenant, je suis moins familier avec PHP mais je n'ai pas encore vu quelque chose qui fasse la même chose avec PHP (ou mod_php). Il est tout à fait possible que je manque quelque chose de simple.Mappage d'URL en PHP?

Comment faites-vous cela en PHP?

Une des raisons pour lesquelles je veux faire ceci est des URL «à usage unique». Maintenant, cela peut être fait avec des paramètres GET (comme un jeton de hachage MD5) mais je suis intéressé par le mappage d'URL comme solution générale à de nombreux problèmes.

Une autre grande raison d'utiliser quelque chose comme ceci est d'avoir des URL RESTful. Ne peut pas être fait en PHP en tant que tel.

Répondre

2

Notez que dans Java, ce ne sont pas les servlets qui mappent les URL, mais la configuration du conteneur de servlet (par exemple Tomcat).

Vous pouvez obtenir des résultats similaires pour les applications PHP en utilisant URL rewriting.

2

Cela ressemble à quelque chose qui mod_rewrite généralement utilisé pour (comme une partie d'Apache, pas de PHP). Je ne l'ai pas entendu parler de quoi que ce soit en PHP qui accomplirait ceci.

13

autres que d'utiliser mod_rewrite , comme déjà rapporté, vous pouvez faire un peu de magie avec un truc simple.

Mettre dans la .htaccess directive comme celui-ci

<FilesMatch "^servlet$"> 
    ForceType application/x-httpd-php 
</FilesMatch> 

remplaçant^$ servlet avec une expression régulière de votre choix (ce sera le nom de votre répartiteur)

Le servlet fichier doit être similaire à ce

<?php 
    $data = explode('/',$HTTP_SERVER_VARS['PATH_INFO']); // $data[0] always empty 
    $fileToInclude = $data[1].'.php'; 
    if (file_exists($data[1]) { 
    $params=array_slice($data,2); // you can do here something more sophisticated 
            // for example sanitize parameters or assemble 
            // an hash 
    include ($fileToInclude);  //Think to this file as a servlet 
    } else { 
    // issue a 404 error, maybe one of the 500 series 
    } 
?> 

l'URL peut avoir la forme: http://yoursite/servlet/reports/sales/2009 vous pouvez également joindre la forme http://yoursite/reports/sales/2009 plaiyng un peu avec les .htacces et le répartiteur.

Cette méthode présente l'avantage que mod_rewrite n'est pas requis en tant que FilesMatch (1.3+) et ForceType (2.0+) sont dans le noyau apache

Voir pour référence
http://httpd.apache.org/docs/2.2/mod/core.html#forcetype
http://httpd.apache.org/docs/2.2/mod/core.html#filesmatch
http://www.devarticles.com/c/a/Apache/Using-ForceType-For-Nicer-Page-URLs/1/

2

Comme d'autres l'ont mentionné, vous pouvez utiliser mod_rewrite pour ce faire, mais vous pouvez également utiliser un modèle de conception de contrôleur frontal qui est ce que la plupart des frameworks web utilisent. Jetez un oeil à Horde routes ou Zend_Controller_Router_Rewrite qui peut être utilisé pour MVC,

12

Un truc que j'utilise est le $ _ SERVER ['PATH_INFO'] (Je pense que vous avez besoin d'Apache). Cela vous obtient toutes les informations après l'extension du fichier PHP.

http://www.example.com/page.php/rest/url 

le $ _ SERVER [ 'PATH_INFO'] contiendra:

"/rest/url" 

La page peut alors rediriger, un processus ou un code tout basé sur cette chaîne.

Cela est bon si vous n'avez pas accès à Apache Configs ou .HTACCESS, et si les choses changent, vous pouvez faire de page.php un nom de répertoire pour le placement de fichiers statiques. Oh et PHP n'ont pas besoin d'avoir une extension .php. J'ai utilisé .api ou somesuch dans le passé.

http://www.example.com/worker.api/rest/url 

Cela semble fonctionner bien pour moi.

+0

Cela fonctionne également dans Lighttpd. – neu242