Asiste al evento de SEO más avanzado del año

Generar códigos de respuesta con Apache

Forzar y generar códigos de respuesta con apache desde .htaccess

Autor:
Carlos Sánchez
Temática:
Rastreo
,
Servidores
Fecha de publicación:
2023-01-02

Última revisión:
2024-04-24

Tengo una publicación acerca de los códigos de respuesta o códigos de estado, cómo funcionan y cómo afectan a los motores de búsqueda dependiendo de su numeración.

No obstante, una vez se sabe que hacen, es importante saber forzarlos o generarlos a conveniencia en cualquier URL de un proyecto que se trabaje.

Para generar cualquier código de respuesta desde apache, no hay más que hacer ciertos ajustes en el archivo .htaccess del proyecto a optimizar. Os enseño distintas vías de hacerlo:

Forzar códigos de estado con Redirectmatch

Con RedirectMatch es la forma más sencilla de generar códigos de respuesta. Como se puede ver en mi generador de redirecciones, se puede hacer una redirección 301, simplemente poniendo:

Quedando un código así:

RedirectMatch 301 ^/seo-avanzado/seo-avanzado/$ https://carlos.sanchezdonate.com/seo-avanzado/

La cuestión es que esto no solo sirve para emplear una redirección, sino para cualquier código de respuesta. Por lo que se pueden generar códigos de respuesta 410, 404 o 503 por ejemplo:

# Esta página nunca ha existido
RedirectMatch 404 ^/wp-sitemap.xml$
# Esta página ya no existe
RedirectMatch 410 ^/servicios/desarrollo-web/$
# La web está en mantenimiento
RedirectMatch 503 ^(.*)$ 

De esta forma, con RedirectMatch cubrimos un amplio abanico que nos permite generar redirecciones en casi cualquier URL. Menos para casos especiales como los de las URL con parámetros donde hay que utilizar comandos más potentes como el RewriteCond.

Rewritecond y rewriterule

Hay casos donde el RedirectMatch se nos puede quedar corto. Ya que por ejemplo queremos generar algún código de respuesta específico ya sea para parámetros, o para usuarios que vengan utilizando un user-agent específico.

El RewriteCond no solo es muy potente, sino que permite un gran número de condiciones las cuales se pueden encontrar en la documentación oficial de apache.

Para entenderlo y saber hacerlo, es más sencillo de comprender viendo un ejemplo de código de forma práctica.

Redirecciones con RewriteCond

<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_URI} ^/ejemplo/
RewriteRule (.*) $1otraurl/ [R=302,L,QSD]
</IfModule>

En este caso se puede ver como se genera una redirección 302 por medio de ese condicional de rewrite (se pueden ver más ejemplos prácticos del mod_rewrite aquí).

Donde se puede apreciar que en el rewrite se especifican las flags (lo que está entre corchetes) que es lo que genera el código de respuesta).

Respuesta de Error

Se pueden generar códigos de respuesta como 401 dependiendo del user-agent y permitiendo prescindir del robots.txt para este propósito. Por ejemplo:

#Activamos el RewriteEnginge
RewriteEngine On
#Definimos los condicionales, como en este caso hipotético, la URL y los User-Agents
RewriteCond %{HTTP_USER_AGENT} ^.*(noxtrumbot|MSIECrawler|WebCopier|ChinaClaw|WebCopier.*v3.2a).*$ [NC]
RewriteCond %{REQUEST_URI} ^/seo-avanzado/ [NC]
#Generamos la respuesta 401
RewriteRule ^.*$ - [F,L]
#También se puede poner el R= con el código de respuesta que suele ser más fácil
#RewriteRule ^(.*)$ /$1 [R=503,L]
#En este caso he puesto un 401 personalizado, que se puede hacer insertando el HTML en Apache, aunque no es la forma más ótima
ErrorDocument 401 '<!DOCTYPE html><html lang="es" xmlns="http://www.w3.org/1999/xhtml"><head><meta charset="utf-8"><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>401 No autorizado</title>></head><h1 style="font-size: 40px;color:#8d096b;">Error 401 No autorizado</h1><p>No est&aacutes autorizado para acceder a esta p&aacutegina y lo sabes, mala suerte.</p></body></html>'
#Se podría hacer con una URL específica:
# ErrorDocument 401 /401_error.html

También se puede hacer esto para prevenir el hotlinking.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://web-random\.com/ [NC]
RewriteRule ^.*$ - [R=204,NC,L]
ErrorDocument 204 '<!DOCTYPE html><html lang="es" xmlns="http://www.w3.org/1999/xhtml"></html>'
</IfModule>

Códigos de respuesta especiales

Generar un 103 Early Hint

Está el 103 Early Hints, que de la serie 1xx en el único código de respuesta que merecería forzar. Pero en este caso, no valdría con un redirectmatch o con un rewrite, ya que lo único que pretendemos es que la web precargue ciertos recursos antes si quiera de que la web HTML tenga que dar un código de respuesta 200, entonces de nada sirve forzar una URL en concreto.

Para que esta funcione, primero tenemos que tener habilitado el h2Push y el h2EarlyHints. También hay que tener en cuenta que solo tendrá efecto en conexiones HTTP/2 (y entiendo que HTTP/3 pero no lo puedo confirmar):

# Por defecto debería estar habilitado:
H2Push on
# Es bastante probable que no esté habilitado:
H2EarlyHints on

Entonces, con todo activado para que funcione de forma óptima, la forma de configurarlo sería la siguiente:

Utilizar un Location (para una URL específica) o un LocationMatch (para un conjunto de URL con regex) donde se quiera activar este early hint, y dentro por medio de un H2PushResource, las fuentes a precargar. Ejemplo:

<LocationMatch "/(seo-avanzado|noticias).*">
H2PushResource /wp-content/themes/sanchezdonate/carlos/css/main.css
H2PushResource /scripts/ejemplo.js
</LocationMatch>

Si te gusta este artículo, me ayudarías un montón compartiendo mi contenido:
No se te da mal el SEO Técnico

Te falta mi máster. Accede a una formación avanzada que te permitirá aplicar e implementar SEO en cualquier tipo de WEB

¡Accede al Máster de SEO Técnico!
Tal vez te interesen otros artículos:
Artículos de SEO

Si te ha gustado esta publicación, siempre me lo puedes agradecer dándome like en esta publicación de LinkedIn sobre este mismo artículo.

Usamos cookies para asegurar que te damos la mejor experiencia en nuestra web. Aquí tienes nuestra política de privacidad.