2010-04-22 33 views
5

Estoy desarrollando un sitio web usando PHP y Apache. quiero convertir mis URL deCómo convertir URL dinámica en URL estática

www.example.com/book.php?book=title

en algo como esto, si es posible, por supuesto:

www.example .com/book/title

Observe que el título de los libros es único y no se puede repetir.

He leído sobre esto, pero ninguno de los mensajes fueron lo suficientemente claros para un principiante como yo. ¿Ustedes saben algún tutorial que lo explique?

Gracias.

Respuesta

0

Ampliando las respuestas de @Rodolphe y @Galen un poco.

Si sus necesidades de reescritura de url son limitadas, un .htaccess codificado con las reglas descritas en el ejemplo de Rodolphe funcionará muy bien.

Sin embargo, como sugiere Galen, sus necesidades pueden ser desconocidas, o es posible que desee ampliarlas más adelante, sin la necesidad de tocar sus reglas de reescritura, una vez que las tenga funcionando.

Una forma común de hacerlo, es diseñar su aplicación alrededor de un esquema de URL que es www.host.com/controller/action/parameter. Un ejemplo de dicha URL podría ser www.host.com/book/view/1, que luego podría manejarse internamente de varias maneras.

1)

tiene secuencias de comandos separados para cada controlador. A continuación, vuelve a escribir cada solicitud en el formulario $controller.php?action=$action&param=$param, redireccionando las solicitudes no coincidentes o no válidas a un controlador predeterminado.

# Serve files and directories as per usual, 
RewriteCond %{REQUEST_URI} !-f 
RewriteCond %{REQUEST_URI} !-d 

# If the request uri doesn't end in .php 
# and isn't empty, rewrite the url 
RewriteCond %{REQUEST_URI} !.php$ 
RewriteCond %{REQUEST_URI} !^$ 
# Try matching against a param request first 
RewriteRule (.*?)/(.*?)/(.*?) $1.php?action=$2&param=$3 [L] 
# If it didn't match, try to match an action 
RewriteRule (.*?)/(.*?) $1.php?action=$2 [L] 

# redirect all other requests to index.php, 
# your default controller 
RewriteRule .* index.php [L] 

2)

Usted tiene un único punto de entrada (o un controlador frontal) a la que redirigir todas las peticiones, y este controlador frontal manijas dirigir la petición al controlador adecuado.

# Redirect all requests that isn't a file or 
# directory to your front controller 
RewriteCond %{REQUEST_URI} !-f 
RewriteCond %{REQUEST_URI} !-d 
RewriteRule .* index.php [L] 

Las reglas de reserva genéricas no adjuntarán ningún parámetro al controlador predeterminado/frontal. Sin embargo, como se trata de una redirección interna, tendrá acceso al REQUEST_URI en PHP para determinar lo que debe hacer.

Estas son, naturalmente, no son sus únicas opciones. Solo mis 2 centavos en la sopa para revolver un poco más.

Descargo de responsabilidad: Todas las reglas de reescritura anteriores (así como todo lo demás, por supuesto) se escriben directamente de la cabeza (después de algunas cervezas) y no se han probado en ninguna parte.

2

La función que está buscando se llama 'la reescritura de URL"

Usted puede hacerlo de forma manual:. Explicas el patrón de uso de expresiones regulares, y el servidor web traduce las peticiones con Apache es comúnmente encontrado bajo. . htaccess, o directyl en el httpd.conf véase el documento oficial aquí:. http://httpd.apache.org/docs/2.0/misc/rewriteguide.html

no es "que" fácil de configurar, sin embargo, la depuración de las expresiones regulares particularmente

con respecto a su problema, pruebe una regla similar. esto:

RewriteEngine on 
RewriteRule ^book/(.*)$ book.php?book=$1 [L] 

Otra opción sería utilizar un marco de php: la mayoría de las veces, esta característica está incorporada. Tienes que "aprender" cómo usar el framework. Si su sitio web ya está terminado, esta no es la mejor opción ...

2

Aquí es la forma kohana (y el 99,99% de los marcos de PHP) lo hace

Añadir un archivo .htaccess (si está usando Apache)

# Turn on URL rewriting 
RewriteEngine On 

RewriteBase/

# Allow any files or directories that exist to be displayed directly 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 

# Rewrite all other URLs to index.php/URL 
RewriteRule .* index.php/$0 [PT,L] 

Esto redirige todas las direcciones URL a index.php. index.php será algún tipo de controlador frontal que carga los scripts basados ​​en la url

Así que en su ejemplo:

localhost/libro/title

index.php sería cargado. Entraría en la url y cargaría la página (controlador) que realmente hará todo el trabajo. en este caso tal vez books.php. books.php obtendría el título del libro de la url y luego buscaría en una base de datos o haría lo que fuera con ese nombre.

3

He creado un enlace interno en el formato estático, como, "http://www.example.com/casestudy/34" en mi página web.

Y he escrito en el archivo .htaccess el siguiente código:

Options +FollowSymLinks 
RewriteEngine On 
RewriteBase/

RewriteRule ^casestudy/([^-]+) /casestudy_details.php?id=$1 [R=301,QSA,L] 
Cuestiones relacionadas