Crear urls amigables con .htaccess y PHP

By enero 14, 2020 PHP, SEO, Sitios Web
url amigable

Urls Amigables htaccess y PHP. Significa que las urls de nuestra web se indexarán mejor y tendremos un mayor posicionamiento SEO.

El funcionamiento del script php para realizar urls amigables es el siguiente:

1.Primero tenemos el fichero con las funciones

funciones.php

<?php
//función que llama al resto de funciones y devuelve el post slug
function  limpiar($texto) {
	$texto = strip_tags($texto);
	$texto = quitar_acentos($texto);
	$texto = preg_replace('|%([a-fA-F0-9][a-fA-F0-9])|', '---$1---', $texto);
	$texto = str_replace('%', '', $texto);
	$texto = preg_replace('|---([a-fA-F0-9][a-fA-F0-9])---|', '%$1', $texto);
	if (ver_utf8($texto)) {
		if (function_exists('mb_strtolower')) {
			$texto = mb_strtolower($texto, 'UTF-8');
		}
	}
	$texto = strtolower($texto);
	$texto = preg_replace('/&.+?;/', '', $texto); // kill entities
	$texto = str_replace('.', '-', $texto);
	$texto = preg_replace('/[^%a-z0-9 _-]/', '', $texto);
	$texto = preg_replace('/\s+/', '-', $texto);
	$texto = preg_replace('|-+|', '-', $texto);
	$texto = trim($texto, '-');
	return $texto;
}
 
function ver_utf8($str) {
	$length = strlen($str);
	for ($i=0; $i < $length; $i++) {
		$c = ord($str[$i]);
		if ($c < 0x80) $n = 0; # 0bbbbbbb
		elseif (($c & 0xE0) == 0xC0) $n=1; # 110bbbbb
		elseif (($c & 0xF0) == 0xE0) $n=2; # 1110bbbb
		elseif (($c & 0xF8) == 0xF0) $n=3; # 11110bbb
		elseif (($c & 0xFC) == 0xF8) $n=4; # 111110bb
		elseif (($c & 0xFE) == 0xFC) $n=5; # 1111110b
		else return false; # Does not match any model
		for ($j=0; $j<$n; $j++) { # n bytes matching 10bbbbbb follow ?
			if ((++$i == $length) || ((ord($str[$i]) & 0xC0) != 0x80))
				return false;
		}
	}
	return true;
}
 
function quitar_acentos($string) {
	if ( !preg_match('/[\x80-\xff]/', $string) )
		return $string;
 
	if (ver_utf8($string)) {
		$chars = array(
		// Decompositions for Latin-1 Supplement
		chr(195).chr(128) => 'A', chr(195).chr(129) => 'A',
		chr(195).chr(130) => 'A', chr(195).chr(131) => 'A',
		chr(195).chr(132) => 'A', chr(195).chr(133) => 'A',
		chr(195).chr(134) => 'AE',chr(195).chr(135) => 'C',
		chr(195).chr(136) => 'E', chr(195).chr(137) => 'E',
		chr(195).chr(138) => 'E', chr(195).chr(139) => 'E',
		chr(195).chr(140) => 'I', chr(195).chr(141) => 'I',
		chr(195).chr(142) => 'I', chr(195).chr(143) => 'I',
		chr(195).chr(144) => 'D', chr(195).chr(145) => 'N',
		chr(195).chr(146) => 'O', chr(195).chr(147) => 'O',
		chr(195).chr(148) => 'O', chr(195).chr(149) => 'O',
		chr(195).chr(150) => 'O', chr(195).chr(153) => 'U',
		chr(195).chr(154) => 'U', chr(195).chr(155) => 'U',
		chr(195).chr(156) => 'U', chr(195).chr(157) => 'Y',
		chr(195).chr(158) => 'TH',chr(195).chr(159) => 's',
		chr(195).chr(160) => 'a', chr(195).chr(161) => 'a',
		chr(195).chr(162) => 'a', chr(195).chr(163) => 'a',
		chr(195).chr(164) => 'a', chr(195).chr(165) => 'a',
		chr(195).chr(166) => 'ae',chr(195).chr(167) => 'c',
		chr(195).chr(168) => 'e', chr(195).chr(169) => 'e',
		chr(195).chr(170) => 'e', chr(195).chr(171) => 'e',
		chr(195).chr(172) => 'i', chr(195).chr(173) => 'i',
		chr(195).chr(174) => 'i', chr(195).chr(175) => 'i',
		chr(195).chr(176) => 'd', chr(195).chr(177) => 'n',
		chr(195).chr(178) => 'o', chr(195).chr(179) => 'o',
		chr(195).chr(180) => 'o', chr(195).chr(181) => 'o',
		chr(195).chr(182) => 'o', chr(195).chr(182) => 'o',
		chr(195).chr(185) => 'u', chr(195).chr(186) => 'u',
		chr(195).chr(187) => 'u', chr(195).chr(188) => 'u',
		chr(195).chr(189) => 'y', chr(195).chr(190) => 'th',
		chr(195).chr(191) => 'y',
		// Decompositions for Latin Extended-A
		chr(196).chr(128) => 'A', chr(196).chr(129) => 'a',
		chr(196).chr(130) => 'A', chr(196).chr(131) => 'a',
		chr(196).chr(132) => 'A', chr(196).chr(133) => 'a',
		chr(196).chr(134) => 'C', chr(196).chr(135) => 'c',
		chr(196).chr(136) => 'C', chr(196).chr(137) => 'c',
		chr(196).chr(138) => 'C', chr(196).chr(139) => 'c',
		chr(196).chr(140) => 'C', chr(196).chr(141) => 'c',
		chr(196).chr(142) => 'D', chr(196).chr(143) => 'd',
		chr(196).chr(144) => 'D', chr(196).chr(145) => 'd',
		chr(196).chr(146) => 'E', chr(196).chr(147) => 'e',
		chr(196).chr(148) => 'E', chr(196).chr(149) => 'e',
		chr(196).chr(150) => 'E', chr(196).chr(151) => 'e',
		chr(196).chr(152) => 'E', chr(196).chr(153) => 'e',
		chr(196).chr(154) => 'E', chr(196).chr(155) => 'e',
		chr(196).chr(156) => 'G', chr(196).chr(157) => 'g',
		chr(196).chr(158) => 'G', chr(196).chr(159) => 'g',
		chr(196).chr(160) => 'G', chr(196).chr(161) => 'g',
		chr(196).chr(162) => 'G', chr(196).chr(163) => 'g',
		chr(196).chr(164) => 'H', chr(196).chr(165) => 'h',
		chr(196).chr(166) => 'H', chr(196).chr(167) => 'h',
		chr(196).chr(168) => 'I', chr(196).chr(169) => 'i',
		chr(196).chr(170) => 'I', chr(196).chr(171) => 'i',
		chr(196).chr(172) => 'I', chr(196).chr(173) => 'i',
		chr(196).chr(174) => 'I', chr(196).chr(175) => 'i',
		chr(196).chr(176) => 'I', chr(196).chr(177) => 'i',
		chr(196).chr(178) => 'IJ',chr(196).chr(179) => 'ij',
		chr(196).chr(180) => 'J', chr(196).chr(181) => 'j',
		chr(196).chr(182) => 'K', chr(196).chr(183) => 'k',
		chr(196).chr(184) => 'k', chr(196).chr(185) => 'L',
		chr(196).chr(186) => 'l', chr(196).chr(187) => 'L',
		chr(196).chr(188) => 'l', chr(196).chr(189) => 'L',
		chr(196).chr(190) => 'l', chr(196).chr(191) => 'L',
		chr(197).chr(128) => 'l', chr(197).chr(129) => 'L',
		chr(197).chr(130) => 'l', chr(197).chr(131) => 'N',
		chr(197).chr(132) => 'n', chr(197).chr(133) => 'N',
		chr(197).chr(134) => 'n', chr(197).chr(135) => 'N',
		chr(197).chr(136) => 'n', chr(197).chr(137) => 'N',
		chr(197).chr(138) => 'n', chr(197).chr(139) => 'N',
		chr(197).chr(140) => 'O', chr(197).chr(141) => 'o',
		chr(197).chr(142) => 'O', chr(197).chr(143) => 'o',
		chr(197).chr(144) => 'O', chr(197).chr(145) => 'o',
		chr(197).chr(146) => 'OE',chr(197).chr(147) => 'oe',
		chr(197).chr(148) => 'R',chr(197).chr(149) => 'r',
		chr(197).chr(150) => 'R',chr(197).chr(151) => 'r',
		chr(197).chr(152) => 'R',chr(197).chr(153) => 'r',
		chr(197).chr(154) => 'S',chr(197).chr(155) => 's',
		chr(197).chr(156) => 'S',chr(197).chr(157) => 's',
		chr(197).chr(158) => 'S',chr(197).chr(159) => 's',
		chr(197).chr(160) => 'S', chr(197).chr(161) => 's',
		chr(197).chr(162) => 'T', chr(197).chr(163) => 't',
		chr(197).chr(164) => 'T', chr(197).chr(165) => 't',
		chr(197).chr(166) => 'T', chr(197).chr(167) => 't',
		chr(197).chr(168) => 'U', chr(197).chr(169) => 'u',
		chr(197).chr(170) => 'U', chr(197).chr(171) => 'u',
		chr(197).chr(172) => 'U', chr(197).chr(173) => 'u',
		chr(197).chr(174) => 'U', chr(197).chr(175) => 'u',
		chr(197).chr(176) => 'U', chr(197).chr(177) => 'u',
		chr(197).chr(178) => 'U', chr(197).chr(179) => 'u',
		chr(197).chr(180) => 'W', chr(197).chr(181) => 'w',
		chr(197).chr(182) => 'Y', chr(197).chr(183) => 'y',
		chr(197).chr(184) => 'Y', chr(197).chr(185) => 'Z',
		chr(197).chr(186) => 'z', chr(197).chr(187) => 'Z',
		chr(197).chr(188) => 'z', chr(197).chr(189) => 'Z',
		chr(197).chr(190) => 'z', chr(197).chr(191) => 's',
		// Decompositions for Latin Extended-B
		chr(200).chr(152) => 'S', chr(200).chr(153) => 's',
		chr(200).chr(154) => 'T', chr(200).chr(155) => 't',
		// Euro Sign
		chr(226).chr(130).chr(172) => 'E',
		// GBP (Pound) Sign
		chr(194).chr(163) => '');
 
		$string = strtr($string, $chars);
	} else {
		// Assume ISO-8859-1 if not UTF-8
		$chars['in'] = chr(128).chr(131).chr(138).chr(142).chr(154).chr(158)
			.chr(159).chr(162).chr(165).chr(181).chr(192).chr(193).chr(194)
			.chr(195).chr(196).chr(197).chr(199).chr(200).chr(201).chr(202)
			.chr(203).chr(204).chr(205).chr(206).chr(207).chr(209).chr(210)
			.chr(211).chr(212).chr(213).chr(214).chr(216).chr(217).chr(218)
			.chr(219).chr(220).chr(221).chr(224).chr(225).chr(226).chr(227)
			.chr(228).chr(229).chr(231).chr(232).chr(233).chr(234).chr(235)
			.chr(236).chr(237).chr(238).chr(239).chr(241).chr(242).chr(243)
			.chr(244).chr(245).chr(246).chr(248).chr(249).chr(250).chr(251)
			.chr(252).chr(253).chr(255);
 
		$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
 
		$string = strtr($string, $chars['in'], $chars['out']);
		$double_chars['in'] = array(chr(140), chr(156), chr(198), chr(208), chr(222), chr(223), chr(230), chr(240), chr(254));
		$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
		$string = str_replace($double_chars['in'], $double_chars['out'], $string);
	}
 
	return $string;
	}
?>



2.Archivo Index.php

Aquí esta un formulario donde vamos a generar el link(slug) para seo conocido como url amigable. Este archivo manda la petición por el método post del formulario, para luego generar un enlace con parámetros get; que nos llevara al siguiente archivo donde mostraremos el contenido generado.

Index.php

<form class="col s12" method="post">
					<div class="row">
						<div class="input-field col s12">
							<i class="material-icons prefix">mode_edit</i>
							<input id="input_text" class="active" type="text" name="titulo" placeholder="Escribe el titulo de tu url" required value="<?php echo $_POST['titulo'];?>">
							<label for="input_text">Titulo</label>
						</div>
					</div>
					<div class="row">
						<div class="input-field col s12">
							<i class="material-icons prefix">comment</i>
							<textarea id="textarea1" class="materialize-textarea" name="contenido" placeholder="Escribe tu contenido" required></textarea>
							<label for="textarea1">Contenido</label>
						</div>
					</div>
					<div class="row">

						<button class="btn waves-effect waves-light" type="submit" name="crear">Crear
														<i class="material-icons right">send</i>
													</button>
					</div>
				</form>
				<?php
if(isset($_POST["crear"])){
			$titulo = $_POST["titulo"];
			$contenido = htmlspecialchars($_POST["contenido"], ENT_QUOTES);
			$link = limpiar($titulo);
	    $id_entrada = 2;
?>
					<a href="publicacion.php?id_entrada=<?php echo $id_entrada;?>&titulo=<?php echo $link;?>&contenido=<?php echo $contenido;?>">
		jaimefranko.com/ejemplos_php/url-amigable-ejemplo/<?php echo $link;?></a>
					<?php
	}
?>

 3. Archivo publicacion.php

 <div class="row center">
     				<!-- inicia codigo -->
									<div class="row">
										<div class="col s12 m4">
											<div class="card">
												<div class="card-image">
													<img src="https://materializecss.com/images/sample-1.jpg">
													<span class="card-title"><?php echo $_GET['titulo'];?></span>
												</div>
												<div class="card-content">
													<p><?php echo $_GET['contenido'];?></p>
												</div>
												<div class="card-action">
													Powered by Jaime Franko
												</div>
											</div>
										</div>
										
										<div class="col s12 m4">
											<div class="card">
												<div class="card-image">
													<img src="https://materializecss.com/images/sample-1.jpg">
													<span class="card-title"><?php echo $_GET['titulo'];?></span>
												</div>
												<div class="card-content">
													<p><?php echo $_GET['contenido'];?></p>
												</div>
												<div class="card-action">
													Powered by Jaime Franko
												</div>
											</div>
										</div>
										
										<div class="col s12 m4">
											<div class="card">
												<div class="card-image">
													<img src="https://materializecss.com/images/sample-1.jpg">
													<span class="card-title"><?php echo $_GET['titulo'];?></span>
												</div>
												<div class="card-content">
													<p><?php echo $_GET['contenido'];?></p>
												</div>
												<div class="card-action">
													Powered by Jaime Franko
												</div>
											</div>
										</div>
									</div>
				    <!-- finaliza codigo -->
      </div>
      <br><br>

Ya solo nos queda configurar el archivo htaccess:

 

RewriteEngine On
RewriteBase /
RewriteRule ^(.*)-([0-9]{1,8}).html$ /ruta-de-mi-php.php?id=$2

Con estas líneas lo que hacemos es:

  • Cualquier cadena desde el directorio donde se encuentra el htaccess–> ^(.*) –> esta es la primera condición.
  • Que dicha cadena contenga entre un guión ‘-‘ y el ‘.html’ un valor numérico de 1 a 8 dígitos de longitud. –> -([0-9]{1,8}).html$
  • Cuando se cumplen estas condiciones mostramos el cotenido con nuestro PHP habiéndole pasado como parámetro el id que lo hemos obtenido en la segunda condición –> $2 que es ([0-9]{1,8}).

Ver Online

jaimefranko

Author jaimefranko

¡Hola! mi nombre es Jaime Franco soy Full Stack Developer, desde el 2010 estoy creando proyectos en diferentes áreas de este maravilloso mundo digital, desde entonces puedo decir que cada día se aprende algo nuevo.

More posts by jaimefranko