Mod-reescritura en Apache:cambiar todas las URL
-
01-07-2019 - |
Pregunta
Ahora mismo estoy haciendo algo como esto:
RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php
Preferiría tener una regla que hiciera lo mismo para cada URL, para no tener que seguir agregándolas cada vez que agrego un archivo nuevo.
Además, me gusta hacer coincidir cosas como '/config/new' con 'config_new.php' si es posible.¿Supongo que alguna expresión regular me permitiría lograr esto?
Solución
Intentar:
Reescribir regla ^/?(\w+)/?$ $1.php
$1 es el contenido de la primera cadena capturada entre paréntesis.Los corchetes alrededor de la segunda barra no son necesarios.
editar:Para el otro partido, prueba esto:
Reescribir regla ^/?(\w+)/(\w+)/?$ $1_$2.php
Otros consejos
Yo haría algo como esto:
RewriteRule ^/?(logout|config|foo)/?$ $1.php
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php
Prefiero enumerar explícitamente las URL que quiero hacer coincidir, para no tener que preocuparme por el contenido estático o por agregar cosas nuevas más adelante que no necesitan reescribirse en archivos php.
Lo anterior está bien si todas las URL secundarias son válidas para todas las URL raíz (book/new
, movie/new
, user/new
), pero no tan bueno si desea tener diferentes sub-URL dependiendo de la acción raíz (logout/new
no tiene mucho sentido).Puede manejar eso con una expresión regular más compleja o enrutando todo a un único archivo php que determinará qué archivos incluir y mostrar según la URL.
La reescritura de mod no puede realizar (potencialmente) reemplazos ilimitados como desea hacer en la segunda parte de su pregunta.Pero consulte el motor de reescritura externo en la parte inferior de la Guía de reescritura de URL de Apache:
Motor de reescritura externo
Descripción:
Preguntas frecuentes:¿Cómo podemos resolver el problema FOO/BAR/QUUX/etc.¿problema?Parece que no hay solución mediante el uso de mod_rewrite...Solución:
Utilice un RewriteMap externo, es decir.un programa que actúa como un RewriteMap.Se ejecuta una vez al inicio de Apache, recibe las URL solicitadas en STDIN y tiene que colocar la URL resultante (generalmente reescrita) en STDOUT (¡mismo orden!).
RewriteEngine on RewriteMap quux-map prg:/path/to/map.quux.pl RewriteRule ^/~quux/(.*)$ /~quux/${quux-map:$1} #!/path/to/perl # disable buffered I/O which would lead # to deadloops for the Apache server $| = 1; # read URLs one per line from stdin and # generate substitution URL on stdout while (<>) { s|^foo/|bar/|; print $_; }
Este es un ejemplo solo de demostración y simplemente reescribe todas las URL /~quux/foo/...a /~quux/bar/....En realidad puedes programar lo que quieras.Pero tenga en cuenta que, aunque un usuario medio también puede utilizar dichos mapas, sólo el administrador del sistema puede definirlos.