reescribe URL desde /index.php?page=about a / page /

Estoy seguro de que esto ha sido publicado en otro lado, pero no puedo encontrarlo. He pasado unas horas investigando e intentando todo lo que puedo hacer desde el código de muestra hasta los generadores. Tengo un sitio que actualmente reside en una subcarpeta llamada “nueva”. Moveré el sitio a la carpeta raíz una vez que esté listo para su lanzamiento. El sitio está basado en una base de datos y ahora mismo para acceder a las páginas que necesita para usar una url como esta:

http://domain.com/new/index.php?page=about

Me gustaría tenerlo así que la URL se ve así:

http://domain.com/new/about/

He intentado tantas cosas diferentes que no sé por dónde empezar. Aquí está el código PHP en index.php que uso:

$page = (isset($_GET['page']) ? $_GET['page'] : 'home'); $data = get_data($page); 

get_data() simplemente toma el contenido de la base de datos según la variable que se le pasó en la URL. Sí, todo está escapado correctamente en la función antes de consultar la base de datos.

Aquí está mi archivo .htaccess actual:

 Options +FollowSymLinks RewriteEngine On RewriteBase /new/ RewriteCond %{REQUEST_FILENAME} -f [NC,OR] RewriteCond %{REQUEST_FILENAME} -d [NC] RewriteRule .* - [L] RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1 RewriteRule ^([a-zA-Z0-9]+)/$ index.php?page=$1 

Por extraño que parezca / new / home / works pero cualquier otro como / new / contact-us / does not works. Lo único que puedo pensar es / home / es el único que no tiene un carácter ‘-‘ en la url. ¿Me estoy perdiendo algo en mi .htaccess para dar cuenta de esto?

Por extraño que parezca / new / home / works pero cualquier otro como / new / contact-us / does not works. Lo único que puedo pensar es / home / es el único que no tiene un carácter ‘-‘ en la url. ¿Me estoy perdiendo algo en mi .htaccess para dar cuenta de esto?

Te estás perdiendo algo para darte cuenta del guion. La expresión regular que estás usando –

 ^([a-zA-Z0-9]+)$ 

Utiliza un rango de caracteres que no incluye el tablero. Analicemos la expresión regular por partes:

  • ^ ancla la coincidencia al comienzo de una cadena
  • ( comienza una agrupación submatch
    • [ comienza una clase de caracteres: esta es [a-zA-Z0-9]+ , que combina tres rangos distintos una o más veces; los rangos especificados son:
      • az coincide con caracteres alfabéticos en minúsculas abcdefghijklmnopqrstuvwxyz
      • AZ coincide con caracteres alfabéticos en mayúscula ABCDEFGHIJKLMNOPQRSTUVWXYZ
      • 0-9 coincide con los caracteres numéricos 0123456789
    • ] termina la clase de personaje
    • + especifica que la clase de caracteres debe coincidir una o más veces
  • ) finaliza el grupo submatch
  • $ ancla el fósforo al final de la cuerda

Tenga en cuenta que ninguno de los rangos que ha especificado en su clase de personaje incluye el guión. Para que coincida con el guión, debes incluir el guión en la clase de personaje, así:

 ^([a-zA-Z0-9-]+)$ 

Para obtener más información sobre las clases de caracteres, la entrada en expresiones regulares en Wikipedia tiene mucha información.

Pruebe esto: [a-zA-Z0-9_-.][\w.]+

Mire esta respuesta para más información.

Vamos a centrarnos en tu expresión regular

 RewriteRule ^([a-zA-Z0-9]+)$ index.php?page=$1 RewriteRule ^([a-zA-Z0-9]+)/$ index.php?page=$1 

Aquí reescribes todos los que coinciden con el patrón:

Comience con la letra (en mayúscula o no, o número) pero no incluye “-” en la expresión regular.

Entonces podrías intentar eso:

 RewriteRule ^([a-zA-Z0-9-]+)$ index.php?page=$1 RewriteRule ^([a-zA-Z0-9-]+)/$ index.php?page=$1 

Pero si haces eso, permites una URL así: index.php? Page = ——-

si solo quieres la url, contáctanos

 RewriteRule ^([a-zA-Z0-9]+(-[A-Za-z])*)$ index.php?page=$1 RewriteRule ^([a-zA-Z0-9]+(-[A-Za-z])*)/$ index.php?page=$1 

Que permiten url así:

 index.php?page=ABaC8 or index.php?page=ABnC9-AIeE 

Por ejemplo.