fichero .htaccess de apache en WordPress

El fichero .htaccess aunque no pertenece al paquete de instalación WordPress es muy necesario tanto para este gestor de contenidos como para otro tipo de web.

Ya que este tiene una multitud de funciones útiles como por ejemplo; denegar el acceso a una IP, comprimir los ficheros, control de cache, proteger un archivo, evitar el hotlinking de imagenes, deshabilitar la navegación de directorio, etc., que nos puede ayudar a mantener seguro nuestro sitio web.

Si este es el primer post que lees sobre este tema .htaccess significa acceso a Hipertexto (Hypertext Access) y es un archivo de configuración del servidor Apache que te permite establecer múltiples directivas como mencione anteriormente.

Apache es un software en el que funciona la mayoría de los sitios web encargado de servir páginas web para plataformas Microsoft Windows, Unix, etc.

Este artículo supone que ya está familiarizado con la funcionalidad básica de WordPress y con la edición de ficheros en su hosting.

Índice de contenido

¿Donde localizo el archivo .htaccess?

El archivo .htaccess es un archivo «oculto» (el punto delante del nombre indica que se trata de archivo oculto).

Para poder visualizarlo debes: Acceder a tu cPanel.  Hacer clic en el «Administrador de Archivos«.

administrador de archivos cPanel

Te abre la pestaña y te ubicas en el directorio principal o la carpeta /public_html. Haces clic en el botón «Configuración» que esta en la esquina superior derecha,  te abre un diálogo y una de las opciones es «Mostrar archivos ocultos» que debes tildar y luego hacer clic en «Save» para guardar los cambios.

Mostras los archivos ocultos de administrador de archivos

Ahora si podrás ver el archivo .htaccess en el directorio, hacer clic en el para editarlo con el editor de texto del hosting o descargarlo y editarlo con tu editor de texto preferido, para luego subirlo nuevamente.

Ubicar fichero htaccess

Realiza una copia del fichero .htaccess antes de modificarlo por si tienes problemas más adelante y así puedes distinguir el que funcionaba bien, del que tiene un error a solucionar.

PARÁMETROS Y DIRECTIVAS .HTACCESS

De forma general se puede decir que las directivas en el .htaccess se componen por el tipo de directiva (Options, AccessFileName, AuthType, AddHandler, AllowOverride, CacheDefaultExpire, CacheDetailHeader, ExpiresActive, ExpiresByType, etc.), los parámetros de la directiva y por último el final de cada línea en que se pueden agregar modificaciones adicionales.

Simbologías utilizadas en el archivo .htaccess

# El carácter numeral puesto al inicio de una línea sirve para escribir un comentario que no tiene ningún efecto en la siguiente linea, el servidor Apache ignora esa línea.
[F] Forbidden: Fuerza un acceso denegado. 403 Forbidden.
[L] Last rule: Indica que es la última regla que debe aplicarse.
[N] Next: Indica continuación hasta que las directivas sean logradas.
[G] Gone: Indica al servidor que ya no existe.
[P] Proxy: Instruye al servidor para manejar los pedidos por mod_proxy.
[C] Chain: Encadena la regla actual con la regla anterior.
[R] Redirect: Indica redirección. Puede haber de varios tipos 301 (permanente), 302 (provisional), 307 (temporal).
[NC] No Case: No sensible a mayúsculas, es decir, que no debe distinguirse entre mayúsculas y minúsculas.
[PT] Pass Through: Pasa el URL a Apache para seguir procesando.
[OR] Or: La expresión debe interpretase como una alternativa junto a la siguiente.
[NE] No Escape: Analiza las salidas de caracteres sin escapar.
[NS] No Subrequest: Para saltar directivas de sub-pedidos internos.
[QSA] Append Query String: Agrega un query string al final de la expresión (URL).
[S=x] Skip: Salta las siguientes “x” reglas del archivo .htaccess.
[E=variable:value] Environmental Variable: Para añadir un valor a una variable.
[T=MIME-type] Mime Type: Declara mime-type al recurso.
[] Dentro de los corchetes se encierran carácteres que definen los resultados.
[]+ Se utiliza para hacer combinaciones.
[^] Excluye los carácteres que pongamos dentro del corchete. Ejemplo [^abcd] excluye las letras a, b, c y d.
[a-z] Letras desde la a hasta la z (en minúsculas).
[A-Z] Letras desde la A hasta la Z (en mayúsculas).
[a-zA-Z] Solo letras de (minúsculas a mayúsculas).
[a-z]{1,10} Solo palabras en minúsculas entre 1 y 10 caracteres.
[0-9] Solo un número.
0-9]{4} Solo números de 4 cifras.
(.*) Cualquier expresión, incluida la vacía.
a{n} Especifica el número exacto de caracteres.
a{n,} Especifica el número “o más” de caracteres.
a{n,m} Especifica un rango entre “n” y “m”. Ejemplo s{3,6} será 3 “eses”, 4 “eses”, 5 “eses” o 6 “eses” etc.
() Agrupa caracteres.
^ Marca el inicio de un argumento.
$ Marca el fin de un argumento.
? Establece como opcional el caracter que le precede.
! Es la negación (excepto). Ejemplo: “!string” resulta “no string”.
. El punto indica cualquier carácter arbitrario.
– Instrucción “not to”.
+ El símbolo de suma indica uno o más caracteres del caracter que le precede. Por ejemplo: (.+) indica cualquier cadena de uno o más caracteres.
| Es el o lógico, condición de alternancia. Ejemplo (x|y) es el caracter x o el y.
 Escapa caracteres, es decir, toma el carácter que le sigue literalmente. Por ejemplo: “.” indica literalmente un punto, ya que sin la barra invertida indicaría cualquier carácter.
/* Indica cero o más “/”.
.* Indica cero o cualquier carácter, incluido que no exista carácter.
^$ Indica una cadena vacía.
^.*$ Pauta estándar que indica “todo”, toda la cadena.
[^/.] Define, un carácter que no sea “/” ni “.”.
[^/.]+ Define, ningún número de carácter que tenga “/” o “.”.
http:// Es literalmente el protocolo “http://”.
^dominio.* Define una cadena que comience con el termino “dominio” y le siga cualquier número de caracteres.
^dominio.com$ define exactamente el “dominio.com”.
-d Prueba si la cadena es un directorio existente.
-f Prueba si la cadena es un archivo existente.
-s Prueba si el archivo en la cadena no tiene valor cero.
Nota: Para asegurar que los siguientes códigos no sean sobrescritos por WordPress, póngalo fuera de los tags # BEGIN WordPress y # END WordPress en el archivo .htaccess.

En las líneas donde aparezca el texto “tudominio.com”, «elnuevodominio.com» sustituir por el dominio correcto del sitio web.

SEGURIDAD


Protege el archivo de configuración de WordPress wp-config.php

Si usas WordPress ya debes saber que este archivo es esencial en tu instalación ya que en el se encuentra el nombre de tu base de datos, la contraseña, etc. El siguiente código es para impedir el acceso a cualquier persona que intente llegar ahí.

# Proteger archivo wp-config
<files wp-config.php>
order allow,deny
deny from all
</files>

Protege también el archivo wp-config-sample.php

Este es otro archivo que deberías proteger ya que a pesar de que no lo utilices o lo hayas borrado o renombrado cuando instalaste WordPress, este siempre se crea o se reemplaza cuando hay una nueva actualización y puede ser utilizarlo por un atacante con el fin de editarlo y reemplazar tu wp-config original.

# Protect wp-config-sample.php
<files wp-config-sample.php>
order allow,deny
deny from all
</files>

Protege carpeta  wp-content/uploads de la ejecución de scripts

Dentro de la carpeta wp-content/uploads crea un nuevo fichero .htaccess y añade el siguiente código.

# Protección contra ejecución de Scripts

AddHandler cgi-script .php .phtml .php3 .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

Protege  wp-Includes

Este código bloquea los scripts usando mod_rewrite en el archivo .htaccess (con Apache) para que no puedan ser accedidos por cualquier usuario.

# Bloquear wp-includes
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^wp-admin/includes/ - [F,L]
RewriteRule !^wp-includes/ - [S=3]
RewriteRule ^wp-includes/[^/]+.php$ - [F,L]
RewriteRule ^wp-includes/js/tinymce/langs/.+.php - [F,L]
RewriteRule ^wp-includes/theme-compat/ - [F,L]
</IfModule>

Nota: Esto código no funciona del todo bien en Multisitios WordPress ya que la regla RewriteRule ^wp-includes/[^/]+.php$ – [F,L] impediría a los archivos ms-files.php file de generar imágenes. Omitiendo esta línea permitirá al código de funcionar.


Proteger ficheros y directorios ocultos

# Proteger ficheros y directorios ocultos
<IfModule mod_rewrite.c>
    RewriteCond %{SCRIPT_FILENAME} -d [OR]
    RewriteCond %{SCRIPT_FILENAME} -f
    RewriteRule "(^|/)." - [F]
</IfModule>


Protege el fichero .htaccess

Una protección contra el mismo fichero, evita que otros pueden acceder al .htaccess.

# Protege htaccess
<files .htaccess>
    order allow,deny
    deny from all
</files>

Evitar el listado de directorios

Si tienes una carpeta en el servidor utilizada para almacenar archivos como los eBooks, o por ejemplo tienes instalado plugins importantes si la carpeta no tiene un archivo index, los visitantes pueden ver todos los archivos dentro de la carpeta sin problemas. En este caso puedes utilizar el siguiente código para evitar que esto suceda.

Options -Indexes

Proteger fichero readme.html

El siguiente código evita que se acceda a readme.html de WordPress ya que contiene el número de versión, muchos hacker buscan vulnerabilidades de sitios web que aun usan usan versión vieja de WordPress.

# Protege fichero readme
<files readme.html>
Deny from all
</files>

Proteger fichero debug.log

WordPress tiene una opción para activar el registro de depuración en un archivo ubicado en wp-content/debug.log. Este archivo puede contener información sensible. Por lo que solamente tu deberías tener acceso a el iniciando sesión en el cPanel de su sito y no un tercero mediante un acceso externo.

# protect debug.log 
<Files debug.log>
order allow,deny
deny from all
</files>

Protección contra inyección SQL, QUERY STRINGS…

#  Protección de inyección SQL
RewriteCond  % {QUERY_STRING}  ( <| % 3C). * Script. * (> | % 3E)  [NC, OR]
RewriteCond  % {QUERY_STRING}  GLOBALS (= |  [|  % [0-9A-Z] {0,2})  [O]
RewriteCond  % {QUERY_STRING}  _REQUEST (= |  [|  % [0-9A-Z] {0,2})
RewriteRule  ^ (. *) $  Index.php  [F, L]
# PROTECT QUERY STRINGS
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{QUERY_STRING} (eval() [NC,OR]
RewriteCond %{QUERY_STRING} (127.0.0.1) [NC,OR]
RewriteCond %{QUERY_STRING} ([a-z0-9]{2000,}) [NC,OR]
RewriteCond %{QUERY_STRING} (javascript:)(.*)(;) [NC,OR]
RewriteCond %{QUERY_STRING} (base64_encode)(.*)(() [NC,OR]
RewriteCond %{QUERY_STRING} (GLOBALS|REQUEST)(=|[|%) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)(.*)script(.*)(>|%3) [NC,OR]
RewriteCond %{QUERY_STRING} (|...|../|~|`|<|>||) [NC,OR]
RewriteCond %{QUERY_STRING} (boot.ini|etc/passwd|self/environ) [NC,OR]
RewriteCond %{QUERY_STRING} (thumbs?(_editor|open)?|tim(thumb)?).php [NC,OR]
RewriteCond %{QUERY_STRING} ('|")(.*)(drop|insert|md5|select|union) [NC]
RewriteRule .* - [F]
</IfModule>
# Protect REQUEST METHOD
<IfModule mod_rewrite.c>
RewriteCond %{REQUEST_METHOD} ^(connect|debug|move|put|trace|track) [NC]
RewriteRule .* - [F]
</IfModule>
# Protect REQUEST STRINGS
<IfModule mod_alias.c>
RedirectMatch 403 (?i)([a-z0-9]{2000,})
RedirectMatch 403 (?i)(https?|ftp|php):/
RedirectMatch 403 (?i)(base64_encode)(.*)(()
RedirectMatch 403 (?i)(='|=%27|/'/?).
RedirectMatch 403 (?i)/($(&)?|*|"|.|,|&|&amp;?)/?$
RedirectMatch 403 (?i)({0}|(/(|...|+++|"")
RedirectMatch 403 (?i)(~|`|<|>|:|;|,|%||s|{|}|[|]||)
RedirectMatch 403 (?i)/(=|
 
amp;|_mm|cgi-|etc/passwd|muieblack) RedirectMatch 403 (?i)(&pws=0|_vti_|(null)|{$itemURL}|echo(.*)kae|etc/passwd|eval(|self/environ) RedirectMatch 403 (?i).(aspx?|bash|bak?|cfg|cgi|dll|exe|git|hg|ini|jsp|log|mdb|out|sql|svn|swp|tar|rar|rdf)$ RedirectMatch 403 (?i)/(^$|(wp-)?config|mobiquo|phpinfo|shell|sqlpatch|thumb|thumb_editor|thumbopen|timthumb|webshell).php </IfModule>

Acceso a wp-login.php solo deteminadas IPs

#Acceso a wp-login.php IPs permitidas
<files wp-login.php>
order deny,allow
deny from all
allow from xxx.xxx.xxx.xxx
</files>

Donde xxx.xxx.xxx.xxx es tu IP si reemplazas los últimos tres dígitos, por ejemplo 0/30, esto especificará un rango de direcciones IP dentro de la misma red, lo que le ahorrará el problema de enumerar todas las direcciones IP permitidas por separado. Pero si las diferentes IP no pertenecen al mismo rango de la IP, solo agregue allow from en cada linea con la IP correspondiente.


Proteger varios archivos vulnerables

El siguiente código es un poco más compacto protege varios archivos a la vez sin necesidad de invocar el mismo comando.

#protege archivos vulnerables

<FilesMatch "^.*(error_log|wp-config.php|php.ini|.[hH][tT][aApP].*)$">
Order deny,allow
Deny from all
</FilesMatch>

Protege tu web del Hotlinking

# Evitar hotlinking de imagenes
 
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?tudominio.com[NC]
RewriteCond %{HTTP_REFERER} !^http(s)?://(www.)?google.com [NC]
RewriteRule .(jpg|jpeg|png|gif)$ - [NC,F,L]

Protege de los comentarios SPAM

Este código es valido solo sino usas una aplicación externa para la gestión de comentarios como Disqus o otro similar, ellos se encargan del SPAM.

# bloquear comentarios a peticiones no referenciadas (SPAM)

RewriteEngine On
RewriteCond %{REQUEST_METHOD} POST
RewriteCond %{REQUEST_URI} .wp-comments-post.php*
RewriteCond %{HTTP_REFERER} !.*tudominio.com.* [OR]
RewriteCond %{HTTP_USER_AGENT} ^$
RewriteRule (.*) ^http://%{REMOTE_ADDR}/$ [R=301,L]

Proteger plugins de WordPress

#asegurar los plugins
<Files ~ ".(js|css)$">
  order allow,deny
  allow from all
</Files>

Bloquea todas las peticiones de user-agent a través de SetEnvIfNoCase

SetEnvIfNoCase es una directiva que permite definir una variable dependiendo de una condición y se puede utilizar para bloquear peticiones user-agent.

#bloquea todas las peticiones de user-agent

SetEnvIfNoCase User-Agent "^magpie-crawler" bad_bot
SetEnvIfNoCase User-Agent "^baiduspider" bad_bot
SetEnvIfNoCase User-Agent "^baidu" bad_bot
SetEnvIfNoCase User-Agent "^baidu.*" bad_bot
SetEnvIfNoCase User-Agent "^Baiduspider/2.0" bad_bot
SetEnvIfNoCase User-Agent "^Yandex.*" bad_bot
SetEnvIfNoCase User-Agent "^YandexBot" bad_bot
SetEnvIfNoCase User-Agent "^Zeus" bad_bot
SetEnvIfNoCase User-Agent "^Ingresa aquí otro User-Agent a bloquear" bad_bot

<Limit GET POST HEAD>
Order Allow,Deny
Allow from all
Deny from env=bad_bot
</Limit>

Limitar el tamaño de subida de archivos

#Protege de ciertos ataques DOS limitando el tamaño de archivos que se suben al servidor
LimitRequestBody 10240000

Denegar el acceso a la web en una hora u horas específicas del día

No se el porqué querrías bloquear el acceso a tu web en ciertas horas del día, pero acá tienes este código útil.

# una hora
 RewriteCond %{TIME_HOUR} ^12$
 RewriteRule ^.*$ - [F,L]

# varias horas
 RewriteCond %{TIME_HOUR} ^(12|13|14|15)$
 RewriteRule ^.*$ - [F,L]

Bloquear peticiones WordPress xmlrpc.php

El fichero xmlrpc.php es uno de lo que más buscan los atacantes para dañar tu web. Editando tu .htaccess puedes deshabilitar el acceso al archivo xmlrpc.php que es responsable de la funcionalidad XML-RPC en WordPress.

  • Los hackers pueden explotar varias vulnerabilidades en la API de WordPress XML-RPC de varias maneras, tales como:
  • Ataques de denegación de servicio (DoS)
  • Escanear puertos en redes internas para obtener información de varios hosts.
  • Hackear enrutadores internos.

Además del beneficio de protección de seguridad, deshabilitar esta característica también puede ayudar a reducir la carga en su servidor, particularmente si su sitio actualmente tiene mucho tráfico no deseado que golpea la API de XML-RPC en su instalación.

NOTA: Solo bloquear esta característica si no está utilizando actualmente la funcionalidad XML-RPC en su instalación de WordPress.

# Bloquear peticiones xmlrpc
<Files xmlrpc.php>
order deny,allow
deny from all
</Files>

VELOCIDAD Y COMPRESIÓN


Cachear css, imagenes, javascript, html, xml…

El siguiente código establece el tiempo de caducidad de los ficheros e indican al navegador si debe solicitar un archivo específico del servidor o simplemente extraerlo del caché. Si la web es estática es aconsejable establecer los encabezados de caducidad del contenido estático a algo muy lejano en el futuro.

<IfModule mod_expires.c>
    ExpiresActive on
    ExpiresDefault                                      "access plus 1 month"

  # CSS
    ExpiresByType text/css                              "access plus 1 year"

  # Data interchange
    ExpiresByType application/json                      "access plus 0 seconds"
    ExpiresByType application/xml                       "access plus 0 seconds"
    ExpiresByType text/xml                              "access plus 0 seconds"

  # Favicon (cannot be renamed!)
    ExpiresByType image/x-icon                          "access plus 1 week"

  # HTML components (HTCs)
    ExpiresByType text/x-component                      "access plus 1 month"

  # HTML
    ExpiresByType text/html                             "access plus 0 seconds"

  # JavaScript
    ExpiresByType application/javascript                "access plus 1 year"

  # Manifest files
    ExpiresByType application/x-web-app-manifest+json   "access plus 0 seconds"
    ExpiresByType text/cache-manifest                   "access plus 0 seconds"

  # Media
    ExpiresByType audio/ogg                             "access plus 1 month"
    ExpiresByType image/gif                             "access plus 1 month"
    ExpiresByType image/jpeg                            "access plus 1 month"
    ExpiresByType image/png                             "access plus 1 month"
    ExpiresByType video/mp4                             "access plus 1 month"
    ExpiresByType video/ogg                             "access plus 1 month"
    ExpiresByType video/webm                            "access plus 1 month"

  # Web feeds
    ExpiresByType application/atom+xml                  "access plus 1 hour"
    ExpiresByType application/rss+xml                   "access plus 1 hour"

  # Web fonts
    ExpiresByType application/font-woff2                "access plus 1 month"
    ExpiresByType application/font-woff                 "access plus 1 month"
    ExpiresByType application/vnd.ms-fontobject         "access plus 1 month"
    ExpiresByType application/x-font-ttf                "access plus 1 month"
    ExpiresByType font/opentype                         "access plus 1 month"
    ExpiresByType image/svg+xml                         "access plus 1 month"
</IfModule>

Comprimir archivos xml, css, javascript y de texto

El siguiente código comprime todos los archivos css, javascript, xml y de texto.

# Comprimir archivos CSS, JavaScript, XML y texto
<ifmodule>
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript
</ifmodule>

Desactivar eTags

Al eliminar el ETag header, inhabilitas las cachés y los navegadores para que no puedan validar archivos, por lo que se ven obligados a confiar en tu Cache-Control y en tu Expires header.

<IfModule mod_headers.c>
    Header unset ETag
</IfModule>
FileETag None

REESCRIBIR Y REDIRECCIONAR DOMINIO


Redirigir peticiones www (www.tusitio.com) a la dirección sin www (tusitio.com)

RewriteEngine on
RewriteCond %{HTTP_HOST} ^www.tudominio.com [NC]
RewriteRule ^(.*)$ http://tudominio.com/$1 [L,R=301]

Redireccionar siempre peticiones www (www.tusitio.com)

RewriteEngine on
RewriteCond %{HTTP_HOST} ^tudominio.com [NC]
RewriteRule ^(.*)$ http://www.tudominio.com/$1 [L,R=301,NC]

Redirigir dominio a un nuevo dominio (transferir page rank a otro dominio)

Esto se puede aplicar en casos por ejemplo que el nombre de tu dominio es demasiado largo y adquieres un nuevo dominio con un nombre más corto y deseas redirigir a los visitantes a la nueva URL.

Redirect 301 (.*)$ http://www.elnuevodominio.com/$1

Esa es una manera de redireccionamiento 301 y mantiene los enlaces intactos. Pasaran de www.dominioviejo.com/blog/link-redireccion a www.nuevodominio.com/blog/link-redireccion. Esto es extremadamente útil cuando solo esta “moviendo” un sitio a un nuevo nombre de dominio.

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} ^dominioviejo.com$ [OR]
  RewriteCond %{HTTP_HOST} ^www.dominioviejo.com$
  RewriteRule (.*)$ http://elnuevodominio.com/$1 [R=301,L]
</IfModule>

Redirecionar a un nuevo dominio temporalmente

# redireccionar provisionalmente
RewriteRule ^(.*)$ http://www.elnuevodominio.com/$1 [R=302,L]

Redireccionar las visitas a URL de página web en mantenimiento

RewriteEngine on
RewriteCond %{REQUEST_URI} !/prueba-mantenimineto.html$
RewriteCond %{REMOTE_ADDR} !^123.123.123.123
RewriteRule $ /maintenance.html [R=302,L]

Reemplaza el 123.123.123.123 con tu dirección IP REAL y “prueba-mantenimiento.html” con el nombre de la página que deseas que tus visitantes vean.


Redireccionar de HTTP a HTTPS

RewriteEngine on
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}

 

OTRAS FUNCIONES UTILES


Descarga directa

En ocasiones, puedes obligar al navegador a descargar contenido en lugar de mostrarlo.

# Descarga Directa
<Files *.md>
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</Files>

Evitar la descarga directa

Lo contrario a lo anterior, obliga al navegador a mostrar contenido en lugar de descargarlo.

# Evitar la Descarga Directa
< FilesMatch ". (Tex | log | aux) $">
     Header set Content-Type text / plain
</ FilesMatch >

Evitar que los motores de búsqueda indexen un archivo

Si desea evitar que los motores de búsqueda indexen un archivo que tiene en su página por algun motivo en particular.
Ejemplo un archivo .pdf agregue la siguiente linea:

# Evitar indexar pdf
<Files ~ ".pdf$">
  Header set X-Robots-Tag "noindex, nofollow"
</Files>

O si desea hacer esto para otro tipos de archivos

# Evitar que se indexen esta paginas o estos formatos

<Files ~ ".(php|xml|json|txt|html)$"> 
  Header set X-Robots-Tag "noindex, noarchive, nosnippet" 
</Files>

Permitir fuentes entre dominios

Los webfonts servidos por CDN podrían no funcionar en Firefox o IE debido a CORS. Este código resuelve el problema.

# Permitir fuentes
< IfModule mod_headers.c>
    < FilesMatch ". (Eot | otf | ttc | ttf | woff | woff2) $">
         Conjunto de encabezado Access-Control- Allow -Origin " * " 
    </ FilesMatch >
</ IfModule >

Servir imágenes de WebP

Si se admiten imágenes WebP y se encuentra una imagen con una extensión .webp y el mismo nombre en el mismo lugar que la imagen png/jpg que se va a publicar, se servirá la imagen WebP.

# Imagenes WebP
RewriteEngine On
 RewriteCond  % {HTTP_ACCEPT}  image / webp 
RewriteCond  % { RAÍZ_DOCUMENTO  } /$1.webp -f 
RewriteRule  (. +) . (Jpe? G | png) $  $ 1.webp  [T = imagen / webp, E = aceptar: 1]

Corregir errores de ortografía en las URL

# Corregir errores de ortografía en las URL
CheckSpelling On

Páginas de Error personalizadas

# Paginas de Error personalizadas
ErrorDocument 401 /error/401.php
ErrorDocument 404 /error/404.php
ErrorDocument 500 /error/500.php

Nota: Para otro tipo de error, se coloca el número de error y la dirección correspondiente para redireccionar al visitante.


Evitar la visualización de errores al visitante

# evitar que los errores se muestren al usuario
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off

Registrar errores de PHP en un fichero log

# registrar errores en carpeta log
php_flag log_errors on
php_value error_log /logs/php_error.log

Compatibilidad UTF-8

El contenido de su texto siempre debe estar codificado en UTF-8, ¿no? esta opción es para los que no utilizan el carácter estándar reconocido por el servidor, con esta medida evitamos mostrar el error 500.

# Utilice la codificación UTF-8 para cualquier texto servido / plain o text / html 
AddDefaultCharset utf-8

# Forzar UTF-8 para varios formatos de archivo 
AddCharset utf-8 .atom .css .js .json .rss .vtt .xml

Conclusión

Ten presente que si insertas algún código en el .htaccess que ya esta implementado mediante un plugins o cometes un error en alguna linea del fichero, causaras un error interno en el servidor lo que puede conllevar a que no muestre tu pagina web, para arreglar dicho error basta con revertir los cambios.

  • Protege el archivo .htaccess de reescrituras ajenas, aplica permisos 644 ó 604.
  • La directiva [L] impide que el servidor no procese más el archivo, una vez que se cumple esa regla, lo que es igual a menos CPU utilizado por el servidor.
  • El tamaño del fichero es importante, mientras más pequeño sea el fichero .htaccess menor sera el tiempo que el servidor tardara de procesar una petición.
  • Además los comentarios en el fichero son fundamentales, dado lo complicado que pueden ser ciertas lineas de código, es imprescindible comentar adecuadamente antes de escribir una nueva directiva para tener una idea, cuando revises el fichero luego y te preguntes el porqué esta cierto «código allí» a que corresponde.
  • Para concluir no escatimes en comentarios y organiza adecuadamente donde colocaras las instrucciones de tu fichero, recuerda realizar una copia del .htaccess antes de modificarlo.

Hay miles de apuntes escritos sobre el fichero .htaccess y es casi imposible abarcarlos todos pero estos son los que considero imprescindibles para un blog.

Espero que con los anteriores ejemplos, puedas configurar tu propio .htaccess según tus necesidades.

Similar Post