2008-12-28 22 views
19

Vengo de un fondo Java y con cualquier tecnología basada en servlets, es trivial mapear un rango de URL (por ejemplo/reports/,/secure/ .do) a un servlet específico. Ahora estoy menos familiarizado con PHP pero aún no he visto nada que haga lo mismo con PHP (o mod_php). Es muy posible que me esté perdiendo algo simple.Asignación de URL en PHP?

¿Cómo se hace esto en PHP?

Una de las razones por las que quiero hacer esto son las URL de "un solo uso". Ahora esto se puede hacer con los parámetros GET (como un token hash MD5) pero me interesa el mapeo de URL como una solución general para muchos problemas.

Otra razón importante para usar algo como esto es tener URL RESTful.

Respuesta

2

No se puede hacer en PHP como tal. Tenga en cuenta que en Java, no son los Servlets las URL de los mapas, sino la configuración del contenedor de servlets (por ejemplo, Tomcat).

Usted puede lograr resultados similares para las aplicaciones PHP usando URL rewriting.

2

Esto suena como algo que mod_rewrite normalmente se utilizaría para (como parte de Apache, no PHP.) No he oído hablar de cualquier cosa en PHP que lograría esto.

13

con excepción de usar mod_rewrite , como ya se informó, puedes hacer un poco de magia con un simple truco.

puesto en el .htaccess una directiva como ésta

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

sustituto^$ servlet con una expresión regular de su elección (que será el nombre de su despachador)

El servlet archivo debe ser similar a este

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

la URL puede tener la forma: http://yoursite/servlet/reports/sales/2009 también se puede llegar a la forma http://yoursite/reports/sales/2009 jugando un poco con los .htacces y el despachador.

Este método tiene la ventaja de que mod_rewrite no es necesario como FilesMatch (1.3+) y ForceType (2.0+) se encuentran en el núcleo de Apache

Véase, por referencia
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

Como han mencionado otros, puedes usar mod_rewrite para hacer esto pero también puedes usar un patrón de diseño de controlador frontal que es lo que muchos de los frameworks web usan. Eche un vistazo a Horde routes o Zend_Controller_Router_Rewrite que se puede utilizar para MVC,

12

Un truco que uso es el $ _ SERVER ['PATH_INFO'] (creo que necesita Apache). Esto le proporciona toda la información después de la extensión de archivo PHP.

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

los $ _ SERVER [ 'PATH_INFO'] contendrá:

"/rest/url" 

La página se puede redirigir, proceso algún código o lo que sea sobre la base de esa cadena.

Esto es bueno si no tiene acceso a Apache Configs o .HTACCESS, Además, si las cosas cambian, puede hacer que page.php sea un nombre de directorio para la colocación de archivos estáticos. Ah, y PHP no necesita tener una extensión .php. He usado .api o somesuch en el pasado.

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

Eso parece funcionar bien para mí.

+0

Esto también funciona en Lighttpd. – neu242