All the tricks of .htaccess and WordPress

The hidden system file .htaccess still not being part of WordPress, has a multitude of functionalities really useful for any web, so it's better to know and get acquainted with him . So let's see what it is, how it works, and learn some useful tricks some little-known ones, that we can use for our installation of WordPress .

 htaccess tricks

1. What is the .htaccess file?

The Apache server software, on which the majority of the Web works, offers directory configuration through the files of Access to Hypertext Hypertext Access in English, better known as files .htaccess to give you an idea of ​​where the file name comes from.

These files .htaccess allow custom settings and specific settings for each system configuration policy site, defined in the main Apache configuration file ( httpd.conf ).

These custom policies can operate inside a file called .htaccess . To do this, the user must grant file .htaccess the appropriate file access and / or editing permissions. Now, in this regard, take note that you should never give write permission for everyone to the file .htaccess the most common and safe is to grant 644 permissions, which allows universal access to read and write permission only to system user.

You should also know that the rules – or directives – of .htaccess affect the top directory and all subdirectories where it is located. So to apply your configurations to a whole web you must place the file .htaccess in the site root folder.

Also, you can also create files .htaccess in a specific directory or subdirectory so that its rules apply only to it.

2. Important notes for novices with .htaccess

Being a configuration file, .htaccess is really powerful, and consequently dangerous if not used well. Even the slightest syntax error, like a spare space, can cause disastrous operation on the server. So it is important that you always make a copy of any relevant file and folder on your website, including the original .htaccess files, before getting involved with files from Access to Hypertext . [19659007] It is also important to check that everything works well on your website after making any changes to the file htaccess however small or irrelevant it may seem to you. If you find an error, undo the changes or recover the saved copy before making them to return your website to normal operation.

3. Beware of performance

The directives of .htaccess offer directory settings without the need to access the main Apache configuration file ( httpd.conf ). However, for performance and security issues, whenever possible, the main configuration file for server policies should always be used.

For example, when a server is configured to process .htaccess directives Apache should search each domain directory and load each and every file .htaccess in each document request. This causes an increase in the processing time of the page and, consequently, impairs performance.

For sites with little traffic this type of performance failures can be negligible, but it can become a serious problem in websites of high traffic.

So, as a rule of thumb, you should only use .htaccess files when you do not have access to the main server configuration file, that is, to the file httpd.conf .

4. Regular expressions (regex) available in .htaccess


One # tells the server to ignore the line, not to execute it. It is used to include comments. You must be clear that each comment line requires its own character # so if you want to add a lot of text remember to put a # at the beginning of each line. It is usually advisable to use only letters, numbers, hyphens and underscores, to avoid possible errors of unwanted calls to the server.
# this is a comment
# each line must have its own pad
# uses only alphanumeric characters, hyphens (-) or underscores (_)
Forbidden (prohibited): tells the server to return the client a 403 Forbidden .
Last rule (last rule): tells the server to stop rewriting once the previous directive is processed .
Next (next): tells Apache to rerun the rewrite until all the rewrite directives have been executed.
Gone (gone): tells the server to deliver the status message Gone (no longer exists) .
] Proxy: tells the server to manage the requests using mod_proxy
Chain (chain): tells the server to chain the current rule with the previous one.
Redirect (redirect): tells Apache to launch a redirect, causing the browser to display the rewritten / modified URL.
No Case: define any argument to which it is associated as not affected by uppercase-lowercase, that is, as case- in sensitive, "NC" = "No Case".
Pass Through (pass through): tells mod_rewrite to pass the rewritten URL back to Apache for processing again.
Or (o): specifies a "or" logic that links two expressions so that if one or the other is fulfilled the rule associated with it is applied.
No Escape: it tells the server to redistribute exit without escaping characters
No Subrequest (without underlying request): tells the server to skip the directive if there are underlying internal requests.
Append Query String: Urges the server to add a request string to the end of the expression (URL).
Skip (skip): tells the server to skip the following "x" rules if it finds some coincidence ..
Environmental Variable (environment variable): tells the server to set the environment variable ("variable") to the defined value ("value").
Mime Type: declares the mime type of the resource to which it is addressed.
specifies a character class, by which any character within the brackets will be considered a match, for example in [xyz] , with x, i z.
[] +
character class in which any c The combination of elements within the brackets is considered a coincidence; for example [zyz] + will consider a match any number of Xs, and Greek or Zetas, or any combination of these characters.
specifies that it is not within a character class; for example, [^xyz] will consider a match any character other than x, y, and z
a hyphen (-) between two characters inside square brackets ([]) defines a range of characters; for example [a-zA-Z] refers to all uppercase and lowercase letters from a to z.
to {n}
specifies an exact number ( n) of the preceding character; for example x {3} refers exactly to three x .
to {n,}
specifies a number no or more of the preceding character; for example x {3,} refers to three x or more.
a {n, m}
specifies a range of numbers, between n and m, of the preceding character; for example x {3,7} refers to three, four, five, six or seven x
is used to group a group of characters together, considering them as a single unit; for example (help)? wordpress will refer to wordpress either with or without the prefix help .
indicates the beginning of a test string of a regular expression (regex); for example, start the argument with the previous character.
indicates the end of a test string of a regular expression; for example, ending the argument with the previous character.
optionally declares the preceding character; for example cachopo? will be valid for cachopo and cachopos, while cachopo (s)? will refer to both cachopo and cachopos; for example x? refers to none or an x.
declares denial; example "! string " will be valid for everything except " string ".
a period (or period) indicates any simple arbitrary character.
- [19659022] indicates that "do not" rewrite the URL, as in " ... * - [F]".
refers to one or more characters of the character preceding; for example, G + refers to one or more Gs, while simply "+" is valid for one or more characters of any type.
refers to zero or more of the characters precedents for example, you can use ". * " as a wildcard.
declares a logical operator "or"; for example, (x | y) is valid for x or and .
escapes special characters ( ^ $!. * | ); for example, use " . " to indicate / escape a point literally.
indicates a literal point (escaped).
/ *
zero or more bars .
. *
zero or more arbitrary characters.
^ $
defines an empty string.
^. * $
the standard pattern for any string to be valid.
defines a character that is neither a bar nor a period.
[^/.] +
defines any numbers or characters that do not contain a bar or period.
http: // [19659022] this is a literal statement - in this case the literal string "http: //".
^ domain. *
defines a string that begins with the term " domain " , probably preceded by any number of characters.
^ domain .com $
defines the exact string " ".
checks if the string is or n existing directory.
checks if the string is an existing file.
checks if the file in the string contains a non-zero value.

Redirect codes header

  • 301 - permanently moved
  • 302 - temporarily moved
  • 403 - prohibited
  • 404 - not found
  • 410 - gone

5. Basic .htaccess directives

Enable basic rewrite

There are servers that do not have the " mod_rewrite " active by default. For it to be active mod_rewrite (basic rewrite) on your site add the following line once in the .htaccess file of the root folder of your web:

# activate rewrite basic
RewriteEngine on

Activate symbolic links

Activate symbolic links ( symlinks ) by adding the following directive in the file .htaccess in which you want them available. Note that for the FollowSymLinks directive to work, the privileges AllowOverride Options must be enabled in the server configuration file:

# activate symbolic links
Options + FollowSymLinks

Enable AllowOverride

For the policies that require AllowOverride such as FollowSymLinks to work, the following directive must be added to the server configuration file. For performance reasons it is important to activate AllowOverride only in the directory or specific directories where necessary. In the following code example, privileges of AllowOverride are activated only in a specific directory (/ www / replace / this / with / the / directory / real). :

# enable allowoverride privileges

AllowOverride Options

Rename the .htaccess file
No all systems allow the only file extension format .htaccess . Fortunately you can rename it to whatever you want, as long as the name is valid in your system. This directive must be placed in the server configuration file or it will not work:

# rename files
AccessFileName ht.access

Note: If you rename the files .htaccess remember that you must update any settings associated with the previous names. For example, if you are protecting your file .htaccess with FilesMatch remember to inform him of the new names:

# protect renamed htaccess files
[19659025] Order deny, allow
Deny from all

Take advantage of the rules defined in httpd.conf

You can save time, effort, and above all resources, defining repeated rules for several virtual housings or only for one through the file httpd.conf . Then you just have to indicate the affected .htaccess files that inherit the rules of httpd.conf including this directive:

RewriteOptions Inherit

6. Improve the performance of your website with .htaccess

 accelerate web

One of the most common and grateful uses of the directives of .htaccess is to improve the web performance, so let's start there.

Improve performance with AllowOverride

First of all remember that you can limit performance drops by activating AllowOverride only in directories where it is necessary An example that you will see very clearly is that if you activate AllowOverride in your whole site the server should review each directory, looking for files .htaccess that may not even exist. To avoid this, we must disable AllowOverride in the file .htaccess of the root folder of the site and then activate it only in the directories where necessary from the server's configuration file. If you did not have access to this server configuration file and you need privileges of AllowOverride do not use this directive:

# improve performance by deactivating allow override
AllowOverride None

Indicating the set of characters

We can avoid 500 errors by indicating the parameter of the default character set before loading them. Of course, replace the "utf-8" example if you use another set of characters on your website:

# indicate the default character set
AddDefaultCharset utf-8

Saving bandwidth

To increase the performance on servers with active PHP (that is, all of which have a WordPress) add the following directive:

# saves bandwidth on servers with active PHP
php_value zlib.output_compression 16386

Deactivating the server signature

This time we deactivated the signature of the server that could identify it:

# deactivates the server signature
ServerSignature Off

Setting the server time zone

With this directive we tell the server to synchronize chronologically according to the time zone of the location that we indicate:

# set the server's time zone
SetEnv TZ Spain / Madrid

Setting the server administrator's email address

Here we specify the server administrator's default email address:

] # set the server administrator email

Improve the transfer speed by activating the file cache

We can greatly improve the transfer speed of our site by activating the file cache . We will use the time in seconds to indicate the duration of the content in cache:

# image cache and flash content one month

Header set Cache-Control "max-age = 2592000"

# text cache, css, and javascript files a week

Header set Cache-Control "max-age = 604800"

# html html file cache one day

Header set Cache-Control "max-age = 43200"

# we use this to activate minimum cache during development tasks on the site

Header set Cache-Control "max-age = 5"

# deactivate the cache for scripts and specific dynamic files

Header unset Cache-Control

# alternative method for file cache
ExpiresActive On
ExpiresDefault A604800 # 1 week
ExpiresByType image / x-icon A2419200 # 1 month
ExpiresByType application / x-javascript A2419200 # 1 month
ExpiresByType text / css A2419200 # 1 month
ExpiresByType text / html A300 # 5 minutes
# disable caching for scripts and other dynamic files

ExpiresActive Off

Conversion of common time intervals in seconds:

  • 300 = 5 minutes
  • 2700 = 45 minutes
  • 3600 = 1 hour
  • 54000 = 15 hours
  • 86400 = 1 day
  • 518400 = 6 days
  • 604800 = 1 week
  • 1814400 = 3 weeks
  • 2419200 = 1 month
  • 26611200 = 11 months
  • 29030400 = 1 year = never expires

Setting the default language

This is a simple way to set the default language for the pages you use in your accommodation: [19659007] # sets the default language
DefaultLanguage en-ES

Declaring specific / additional MIME types

# adds several mime types
AddType application / x-shockwave-flash. swf
AddType video / x-flv .flv
AddType image / x-icon .ico

Sending the character set and other headers without meta tags

# sends the language tag and default character set
# AddType 'text / html; charset = UTF-8 'html
AddDefaultCharset UTF-8
DefaultLanguage en-EN

Limiting GET and PUT request methods to the server

# limits GET and PUT methods of requests to the server [19659025] Options -ExecCGI -Indexes -All
RewriteEngine on
RewriteCond% {REQUEST_METHOD} ^ (TRACE | TRACK | OPTIONS | HEAD) RewriteRule. * - [F]

Processing Files selectively according to the request method

# process files according to the request method to the server
Script PUT /cgi-bin/upload.cgi
Script GET /cgi-bin/download.cgi[19659215] Executing several types of files using a cgi script

In those special situations where we need to process several types of files with some specific cgi script, better define it:

# execute all png files using png-script .cgi
Action image / png /cgi-bin/png-script.cgi

7. Improve the security of your website with .htaccess

 web security

Another of the most common uses of .htaccess is to increase the security of a website, and we have a lot of tricks for

Avoid access to .htaccess

Add the following code to your file .htaccess to add an extra layer of security. What you get is that any attempt to access the file .htaccess results in an error message 403. Do not forget, however, that our first defense layer is to protect the files .htaccess ] Changing the permissions to 644 with CHMOD, as we have seen before.:

# securing the htaccess file
<Files. htaccess>
order allow, deny
deny from all

Avoid access to a specific file

We can apply the same directive to any other file that we want to protect, such as the file "contabilidad.pdf" of the next example:

# avoid visualization of a particular file

order allow, deny
deny from all

Prevents access to several files

To prevent access to several types of files, add the Next code and modify the list of file types between vertical bars to suit your needs:

Order Allow, Deny
Deny from all

Prevents directory navigation unauthorized

We can avoid browsing directories by telling the server to return a "Prohibited - Authorization required" message to any attempt to view a directory . This happens when in a directory there is no index page (index.html or index.php), and if you do not add any security control any visitor could see the contents of that directory from your browser. To avoid this just add the following rule:

# deactivate directory navigation
Options All -Indexes

On the other hand, if you want to allow this type of navigation, use the following directive:

# activate directory navigation
Options All + Indexes

Another way to prevent the server from displaying directories is with the following directive:

# avoid the list of folders
IndexIgnore *

And finally, you can use the directive IndexIgnore to avoid showing certain file types:

# avoid certain file types are displayed
IndexIgnore * .wmv * .mp4 * .avi * .etc

Changes the default index page

This rule tells the server to search and display "store.html" as the directory's default index. It must be in the file .htaccess of the directory in which you want to replace the default index file, for example "index.html":

# serves an index page alternative to the default one
DirectoryIndex tienda.html

With the following rule we go a step further and tell the server to check the files in the root directory and show the first one in the list (from left to right) , if the following one does not exist and so on:

# serves the first available file in the list as the default index
DirectoryIndex tienda.html index.php index.html default.htm

Hide extensions of script

Another way to improve security is to hide the script languages ​​by replacing the actual extensions of the scripts with paste extensions of your choice. For example, changing the extension " .foo " to " .php ":

# serves foo files as php files
AddType application / x-httpd -php .foo

# serves foo files as cgi files
AddType application / x-httpd-cgi .foo

Limits access to the Local Area Network (LAN)

# limits access to the local area network

order deny, allow
deny from all
allow from

Secures directories by IP address and / or domain

In this example all IP addresses are allowed except 16.654.98.123 and the domain "":

# allow all except those indicated

order allow, deny
allow from all
deny from 16.654.98.123
deny from. * Domain .es. *

In this other example, access to all IP addresses is denied except for 16.654.98.123 and the domain "":

# deny access to all except those indicated

order deny, allow
deny from all
allow from 16.654.98.123
allow from. * Domain .es. *
[19659007] Next we go a little further and block undesirable visitors based on the reference domain. You can also save bandwidth by blocking specific file types as we saw before the reference domains. Simply change the example domain names for your hated favorites:

# block visitors from the following domains

RewriteEngine on
RewriteCond% {HTTP_REFERER} robaperas .info [NC,OR]
RewriteCond% {HTTP_REFERER} payfantas .net [NC,OR]
RewriteRule. * - [F]

Prevents or allows access to the domain to a range of IP addresses

There are several effective ways to block a range of IP addresses using .htaccess and we will see several. The first one we have blocks a range of IPs specified by its CIDR (Classless Inter-Domain Routing) number. This method is very useful to block super spammers such as RIPE, Optinet and the like. If, for example, you realize that you are adding a bunch of Apache directive lines deny for addresses that start with the same numbers, choose one of them and do a whois . Under the whois results list you will find the CIDR value that represents each IP address associated with that particular network. So blocking using the CIDR is a very effective way to prevent a lot of IPs from the same attacker from trying to access your website. Here is a very generic example of blocking by CIDR, change the numbers you want to block:

# block range of IPs by CIDR number

order allow, deny
allow from all
deny from
deny from 80.0.0 / 8

The opposite situation would be to allow access to one IP per CIDR number: [19659007] # allow an IP range by CIDR number

order deny, allow
deny from all
allow from
allow from 80.0.0 / 8

Another effective way to block a full range of IP addresses requires truncating digits until the searched range appears. As an IP address is read from left to right its value represents a specific address. For example, an IP address refers to a specific and unique IP address. Now, if we remove the last two digits (66) of the address, it will refer to any IP address that starts with the rest of the numbers, that is, 99.88.77 is valid for,, ... , ... and so on.

And if we continue with the same system, removing another pair of digits from the address, its range is extended to refer to any IP address that starts with 99.88.xx.xx, so you would block 65,536 addresses IP (256 * 256). Following this logic it is possible to block a whole range of IP addresses to different degrees of need. The following example is a sample of what we are talking about:

# block an IP range by truncating numbers

order allow, deny
allow from all
deny from
deny from 99.88.77. *
deny from 99.88. *. *
deny from 99. *. *. *

And para hacerlo al contrario, también podemos dar permisos a rangos de IPs usando el mismo sistema:

# permitir a un rango de IP por truncado de números

order deny,allow[19659025]deny from all
allow from
allow from 99.88.77.*
allow from 99.88.*.*
allow from 99.*.*.*

Bloquea o permite acceso a múltiples direcciones IP en una sola línea

Podemos ahorrar algo de espacio bloqueando rangos de direcciones IP en una sola línea:

# bloqueo de dos direcciones IP concretas
deny from
# bloqueo de tres direcciones IP concretas
deny from 99.88 99.88.77 11.22.33

Y, de igual modo, podemos permitir acceso a varias IPs en una sola línea con el mismo truco:

# permiso de acceso a dos direcciones IP concretas
allow from
# permiso de acceso a tres direcciones IP concretas
allow from 99.88 99.88.77 11.22.33

Más reglas para bloquear y permitir acceso a direcciones IP

Otras posibles reglas para bloquear diversos tipos de direcciones IP serían las siguientes. Estas reglas se pueden adaptar igualmente para dar permiso a valores concretos de IPs simplemente cambiando la directiva  deny por allow:

# bloquear un dominio parcial a través de valores de red o máscara de red
deny from

# bloquear un solo dominio
deny from

# bloquear pero permitir a
order deny,allow
deny from
allow from

Para el “hotlinking” y servir contenido alternativo

Ya hemos hablado varias veces del hotlinkingesa  plaga de roba webs que rulan por Internet. Si quieres que se muestre un contenido distinto en aquellos sitios que te roban tus publicaciones copiando y pegando directamente o desde agregadores RSS puedes usar el siguiente código. Por supuesto cambia las rutas y nombres de archivo del ejemplo por los tuyos. Ten en cuenta también que este método bloquea todos los servicios RSS, como Feedburner o Feedly. Si quieres un método más refinado usa el de este enlace:

# parar el hotlinking y mostrar contenido alternativo

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?*$ [NC]
RewriteRule .*.(gif|jpg)$ [R,NC,L]

Si quieres mostrar una página de error en vez de una imagen desagradable, remplaza la línea que contiene la RewriteRule del código anterior por la siguiente línea:

# servir una página stander de 403 prohibido
RewriteRule .*.(gif|jpg)$ - [F,L]

Si, por el contrario, quieres permitir que algún servicio o sitio concreto que no sea el tuyo pueda mostrar tus imágenes añade el siguiente código después de la línea que contiene la cadena “” del ejemplo anterior:

# permitir hotlinking del siguiente sitio
RewriteCond %{HTTP_REFERER} !^http://(www.)?*$ [NC]

A continuación veremos unas reglas muy útiles para evitar que nos inyecten código. Todos los agentes que pongamos en la lista tendrán acceso denegado y recibirán un mensaje de error. Hay muy buenas listas por ahí, así que no te quedes en el ejemplo. Y, por favor, NO incluyas el “[OR]” en la última directiva RewriteCond o tu servidor se caerá mostrando múltiples errores 500 en todas las páginas:

# denegar acceso a robots maliciosos, extractores de webs y navegadores offline
RewriteBase /
RewriteCond %{HTTP_USER_AGENT} ^Anarchie [OR]
RewriteCond %{HTTP_USER_AGENT} ^ASPSeek [OR]
RewriteCond %{HTTP_USER_AGENT} ^attach [OR]
RewriteCond %{HTTP_USER_AGENT} ^autoemailspider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xenu [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus.*Webster [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]

También puedes mostrar un mensaje de error más amistoso enviando a tus molestos amigos a un sitio a tu elección simplemente remplazando la direc tiva RewriteRule de la última línea del código anterior con alguno de los siguientes ejemplos:

# los mandamos a un sitio cachondo a nuestra elección
RewriteRule ^.*$ [R,L]

También, siendo algo más malo, puedes mandarles a un agujero negro virtual o a una dirección de email falsa:

# los mandamos a un agujero negro virtual o a una dirección de email falsa
RewriteRule ^.*$ [R,L]

Puedes también incluir sitios de referencia específicos a tu lista negra usando HTTP_REFERER:

RewriteCond %{HTTP_REFERER} ^$
RewriteRule !^http://[^/.]* - [F,L]

Otros divertidos trucos de bloqueo

Aunque las siguientes técnicas de redirección están pensadas para bloquear y redirigir a sitios indeseables ta mbién puedes usarse para redirecciones más amables y útiles:

# redirigir cualquier petición de lo que sea de un sitio spam a otro
RewriteCond %{HTTP_REFERER} ^http://.*sitiospam.*$ [NC]
RewriteRule .* [R]

# redirigir todas las peticiones de un sitio a la imagen de otro sitio de spam
RewriteCond %{HTTP_REFERER} ^http://.*sitiospam.*$ [NC]
RewriteRule .* http://www.otrositiospam/algo.jpg [R]

# redirigir tráfico de una dirección o rango a otro sitio
RewriteCond %{REMOTE_ADDR} 192.168.10.*
RewriteRule .* [R]

Aún más trucos para bloquear escoria

Lo que sigue es una serie de códigos paso a paso que te ayudarán a bloquear todo tipo de entidades. No van por separado sino combinados entre ellos así que observa lo que hacen y adáptalos a tus necesidades::

# establecemos variables para agentes de usuario, referencias y direcciones IP
SetEnvIfNoCase User-Agent ".*(user-agent-you-want-to-block|php/perl).*" BlockedAgent
SetEnvIfNoCase Referer ".*(block-this-referrer|and-this-referrer|and-this-referrer).*" BlockedReferer
SetEnvIfNoCase REMOTE_ADDR ".*(666.666.66.0||999.999.99.999).*" BlockedAddress

# establecemos la variable para clacker red clase B que provenga de  una red a bloquear determinada
SetEnvIfNoCase REMOTE_ADDR "66.154.*" BlockedAddress

# establecemos la variable para dos redes clase B concretas de ejemplo y
SetEnvIfNoCase REMOTE_ADDR "198.2(5|6)..*" BlockedAddress

# denegamos acceso a cualquiera que se ajuste a los anteriores códigos y les enviamos un mensaje 403

order deny,allow
deny from env=BlockedAgent
deny from env=BlockedReferer
deny from env=BlockedAddress
allow from all

Protege con contraseña archivos, directorios y más…

Un modo exhaustivo de asegurar un sitio es usar autenticación mediante usuario y contraseña, pudiendo proteger archivos concretos, varios archivos, directorios o incluso protegerse de cualquier IP excepto de la especificada. Hay un paso previo y es la creación del fichero .htpasswdque  puedes generar aquí. Adapta los siguientes códigos a tus especificaciones:

# proteger con contraseña un archivo

AuthType Basic
AuthName "Aviso"
AuthUserFile /home/ruta/.htpasswd
Require valid-user

# proteger con contraseña varios archivos

AuthType basic
AuthName "Desarrollador"
AuthUserFile /home/ruta/.htpasswd
Require valid-user

# proteger con contraseña el directorio en el que está alojado el htaccess
AuthType basic
AuthName "Este directorio está protegido"
AuthUserFile /home/ruta/.htpasswd
AuthGroupFile /dev/null
Require valid-user

# proteger con contraseña el directorio para cada IP excepto la especificada
# crea un fichero htaccess en cada directorio para pr otegerlo
AuthType Basic
AuthName "Personal"
AuthUserFile /home/ruta/.htpasswd
Require valid-user
Allow from
Satisfy Any

Nota: la mayoría de proveedores de alojamiento actuales ofrecen la protección de carpetas y archivos mediante contraseña desde su panel de control, evitando la necesidad de crear y modificar ficheros manualmente.

Requerir SSL (Secure Sockets Layer)

Lo siguiente es un método excelente para requerir SSL:

# requerir SSL
SSLOptions +StrictRequire
SSLRequire %{HTTP_HOST} eq ""
ErrorDocument 403

# requerir SSL sin mod_ssl
RewriteCond %{HTTPS} !=on [NC]
RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [R,L]

Automáticamente CHMOD varios tipos de archivo

Este otro método es genial para hace r cambios de permiso mediante CHMOD a varios tipos de archivo. Pon estas reglas en el .htaccess de la carpeta raíz para que afecte a todos los tipos de archivo, o sitúalo en una carpeta concreta para que afecte solo a los archivos de la misma. Por supuesto, modifica los archivos del código a lo que quieras modificar tu:

# cambiar ajustes CHMOD para archivos concretos
# recuerda nunca poner CHMOD 777 a menos que sepas lo que estás haciendo
# los archivos que requieran acceso global de escritura deben usar CHMOD 766 en vez de 777
# puedes hacer que ciertos tipos de archivo sean privados con CHMOD en 400
chmod .htpasswd files 640
chmod .htaccess files 644
chmod php files 600

Oculta todas las extensiones de archivo

Este método disfraza todos los tipos de archivo, sus extensiones de archivo, y los muestra como si fuesen archivos .php (o lo que tu quieras):

# disfraza todas las extensiones de archivo como si fuesen php
ForceType application/x-httpd-php

Protégete contra ataques de denegación de servicio (DOS) limitando el tamaño de carga de archivo

Una manera de prot eger tu servidor de ataques DOS es limitar el tamaño máximo permitido para carga de archivos. En este ejemplo limitamos el tamaño de subida a 10240000 bytes, el equivalente a 10 megabytes. Lógicamente, este código solo es útil si permites subir archivos a tu sitio:

# protección contra ataques DOS limitando el tamaño de carga de archivos
LimitRequestBody 10240000

Asegura directorios desactivando la ejecución de scripts

Para evitar la ejecución de scripts maliciosos nada mejor que asegurar los directorios que puedan verse afectados. Cambia las extensiones de script a lo que necesites:

# asegurar directorio desactivando la ejecución de scripts
AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI

8. Trucos de usabilidad

estandares web

Miminiza el parpadeo de imagen por CSS en IE6

Con las siguientes reglas minimizamos o incluso eliminados el parpadeo de imagen de fondo por CSS en Internet Explorer 6:

# minimizar parpadeo de imagen en IE6
ExpiresActive On
ExpiresByType image/gif A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/png A2592000

Sirve páginas de error personalizadas

Usa las siguientes reglas para mostrar tus propias páginas de error personalizadas. Simplemente recuerda cambiar la ruta y archivos por los que hayas creado tu. Ten en cuenta que tus páginas de error deben pesar más de 512 bytes para que no las ignore Internet Explorer:

# servir paginas de error personalizadas
ErrorDocument 400 /errores/400.html
ErrorDocument 401 /errores/401.html
ErrorDocument 403 /errores/403.html
ErrorDocument 404 /errores/404.html
ErrorDocument 500 /errores/500.html

Ofrece un documento de error global

# ofrece un documento de error global
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /carpeta/error.php [L]

Usa comprobación de errores de ortografía básicos en URLs

El siguiente truco es magia pura para corregir errores básicos de ortografía en URLs:

# corregir automaticamente errores de ortografia

CheckSpelling On

Indica al navegador que descargue los archivos multimedia en vez de mostrarlos

Normalmente los navegadores tratan de reproducir los archivos multimedia cuando ofreces un enlace a los mismos. El siguiente método fuerza a que se muestre un mensaje en el que ofrece reproducirlos o descargarlos:

# indica al navegador que descargue los archivos multimedia
AddType application/octet-stream .avi
AddType application/octet-stream .mpg
AddType application/octet-stream .wmv
AddType application/octet-stream .mp3

Indica al servidor que muestre el código fuente de los tipos de archivo dinámicos

En ocasiones puede que quieras mostrar el contenido de archivos dinámicos en vez de ejecutarlos como scripts. Crea un directorio donde situar estos archivos que prefieres que se visualicen en vez de ejecutarlos y añade la siguiente línea de código al .htaccess de ese directorio:

RemoveHandler cgi-script .pl .py .cgi

Redirige a los visitantes a un sitio temporal durante tareas de desarrollo o mantenimiento

Cuando estás haciendo tareas de desarrollo, reparación o mantenimiento, es buena idea disponer de un sitio alternativo donde ofrecer contenido a tus visitantes, y sobre todo avisarles de que el sitio no está desaparecido sino simplemente mejorándose. Por supuesto, debes disponer del sitio temporal y adaptar el código a la ruta que elijas:

# redirigir a los visitantes a un sitio alternativo
ErrorDocument 403
Order deny,allow
Deny from all
Allow from

Pide contraseña de acceso a los visitantes durante tareas de desarrollo o mantenimiento

Otra posible solución es esconder tu sitio durante las tareas de mantenimiento o mejora. Para ello bloquearemos los acceso normales pidiendo usuario y contraseña mediante el método anterior de .httppasswd y permitiremos acceso a IPs concretas:

# contraseña para los visitantes
AuthType basic
AuthName "Este sitio está actualmente en mantenimiento"
AuthUserFile /home/ruta/.htpasswd
AuthGroupFile /dev/null
Require valid-user
# permitimos al webmaster y otros acceder
Order Deny,Allow
Deny from all
Allow from
Allow from favorite.validation/services/
Allow from
Satisfy Any

Evita acceso a archivos o directorios durante periodos de tiempo concretos

Estupendo truco para evitar accesos por periodos horarios. Muy friki pero útil en ocasiones:

# evitar acceso a media noche
RewriteCond %{TIME_HOUR} ^12$
RewriteRule ^.*$ - [F,L]

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

9. Trucos de redirección

redireccion web

Nota importante relativa a las redirecciones a través de mod_rewrite

Para que funcionen las redirecciones que usen la directiva mod_rewrite es necesario que esté activo RewriteEngine. Es una práctica común activar la directiva  mod_rewriteya sea en el archivo de configuración del servidor o al principio del fichero .htaccess en la carpeta raíz del sitio. Si la directiva mod_rewrite no está incluida en alguno de estos dos lugares debería añadirse en la primera línea de cualquier bloque de código que use una función de rewrite (p.ej., mod_rewrite), pero solo debe incluirse una sola vez en cada archivo .htaccess:

# se inicia y activa el motor rewrite
RewriteEngine on

Redirección desde a

Se puede usar una redirección 301 para definir una redirección permanente desde la versión con www de un dominio a su respectiva versión sin www. Eso sí, comprueba que no hay errores siempre que hagas una redirección 301, hay incluso herramientas de comprobación de cabeceras del servidor para ello. También es importante incluir siempre una barra “/” el enlazar directorios, y – muy importante – no marees a los buscadores, sé consistente con la decisión de www o no www, o lo usas siempre o nunca pero no una mezcla:

# redirección permanente de dominio www a sin www
RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^$ [NC]
RewriteRule ^(.*)$$1 [R=301,L]

Redirección desde a

Un modo básico de cambiar de un dominio viejo a  uno nuevo (en el que no cambien los nombres de archivos y carpetas, importante) es crear una regla de Rewrite para redirigir del viejo dominio al nuevo. Nada más hacer la redirección puede que aún veas la URL del viejo dominio en la barra de direcciones del navegador, así que para comprobar que lo has hecho bien haz clic en cualquier enlace interno o imagen para comprobar que se ha hecho la redirección y todo está en el nuevo:

# redireccion de un dominio viejo al nuevo
RewriteEngine On
RewriteRule ^(.*)$$1 [R=301,L]

Redirección a una dirección concreta en base a caracteres concretos

No es tan raro. Imagina que quieres redirigir cualquier petición que contenga el carácter “seo” a una categoría concreta situada en, pues entonces remplazaremos en el ejemplo la cadena “texto-buscado” por “seo” y, lógicamente, la URL de destino:

# redirigir cualquier variación de un carácter específico a una dirección concreta
RewriteRule ^texto-buscado [R]

Y aquí otros dos métodos para hacer este tipo de tareas especiales:

# redirigir variaciones de URL al mismo directorio de del mismo servidor
AliasMatch ^/espec(ie|ies) /www/docs/destino

# redirigir variaciones de URL al mismo  directorio de otro servidor
RedirectMatch ^/[eE]spec(ie|ies)

Otros curiosos pero estupendos trucos de redirección

# redirección de un sitio completo con 301
redir ect 301 /

# redirigir un archivo concreto con 301
redirect 301 /current/currentfile.html

# redirigir un sitio completo con redirección permanente
Redirect permanent /

# redirigir una página o directorio con redirección permanente
Redirect permanent viejo_archivo.html
Redirect permanent /viejo_directorio/ http://www.nuevo-dominio/nuevo_directoriio/

# redirigir un archivo usando RedirectMatch
RedirectMatch 301 ^.*$

Nota: Al redirigir archivos concretos utiliza la regla de Apache Redirect para los archivos dentro de un mismo dominio y la regla de Apache RewriteRule para cualquier otro dominio, especi almente si son distintos. La regla RewriteRule es más potente que la regla Redirecty debería funcionar de manera más eficaz.

Por tanto, usaremos los siguientes códigos para conseguir una redirección más precisa y potente (la primera línea redirige un archivo, la segunda un directorio y la tercera un dominio):

# redirigir archivos directorios y dominios con RewriteRule

Envia a los visitantes a un subdominio

Esta regla te asegura que todos los visitantes que estén viendo páginas en el subdominio que elijas. Edita “subdomain”, “domain” y “tld” para poner tu subdominio, dominio y extensión de dominio, respectivamente:

# envía a los visitantes a un subdominio
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^$ [NC]
RewriteRule ^/(.*)$ http://subdomain.domain.tld/$1 [L,R=301]

Más diversión con RewriteCond y RewriteRule

# rewrite solo si no se encuentra el archivo
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)especial.html?$ cgi-bin/especial/especial-html/$1

# rewrite solo si no se encuentra una imagen
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule imagenes/especial/(.*).gif cgi-bin/especial/mkgif?$1

# reglas seo de rewrite para varias carpetas
RewriteRule ^(.*)/aud/(.*)$ $1/archivos-audio/$2 [L,R=301]
RewriteRule ^(.*)/img/(.*)$ $1/archivos-imagen/$2 [L,R=301]
RewriteRule ^(.*)/fla/(.*)$ $1/archivos-flash/$2 [L,R=301]
RewriteRule ^(.*)/vid/(.*)$ $1/archivos-video/$2 [L,R=301]

# analisis de paquetes del navegador - sniffers - mediante entornos variables de htaccess
RewriteCond %{HTTP_USER_AGENT} ^Mozilla.*
RewriteRule ^/$ /index-for-mozilla.html [L]
RewriteCond %{HTTP_USER_AGENT} ^Lynx.*
RewriteRule ^/$ /index-for-lynx.html [L]
RewriteRule ^/$ /index-for-all-others.html [L]

# redirigir una query a la búsqueda de Google
Options +FollowSymlinks
RewriteEngine On
RewriteCond %{REQUEST_URI} .google.php*
RewriteRule ^(.*)$ ^$1 [R,NC,L]

# denegar una petición en base al metodo de la petición
RewriteRule ^.*$ - [19659068]

# redirigir las cargas a un sitio mejor
RewriteRule ^(.*)$ /cgi-bin/procesador-cargas.cgi?p=$1 [L,QSA]

Más diversión con Redirect 301 y RedirectMatch 301

# redirección seo para un solo archivo
Redirect 301 /viejo-directorio/viejo-archivo.html

# redireccion seo para varios archivos
# redirige todos los archivos de un directorio cuyas primeras letras sean xyz
RedirectMatch 301 /directorio/xyz(.*)$1

# redireccion seo para redigirir un sitio entero a otro dominio
Redirect 301 /

10. Trucos especiales para WordPress

trucos wordpress

Hemos visto muchos trucos de .htaccess para WordPress pero aquí tienes los conceptos básicos y también un truco útil que es posible que no conocieses.

Los “permalinks” de WordPress

Ya sabrás que WordPress crea el archivo .htaccess cuando cambias los enlaces permanentes (permalinks) a alguna otra cosa distinta de los que vienen por defecto, y además añade unas reglas básicas para que funcionen. Esta configuración básica sería la siguiente:

# BEGIN WordPress

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# END WordPress

Ahora bien, si WordPress está instalado en  un subdirectorio (por ejemplo “blog”) entonces las directivas serían así

# BEGIN WordPress

RewriteEngine On
RewriteBase /blog/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /blog/index.php [L]

# END WordPress

Asegura los formularios de contacto de WordPress

Un modo de asegurar los por defecto inseguros formularios de contacto de WordPress es verificar el dominio desde donde se invoca al formulario. Recuerda cambiar el dominio y página de contacto del ejemplo por los tuyos:

# asegurar formularios de contacto de wordpress depende de quien lo invoca
RewriteCond %{HTTP_REFERER} !^*$ [NC]
RewriteCond %{REQUEST_POST} .*contacto.php$
RewriteRule .* - [F]

truco magia

Activa SSI para tipos de archivo HTML/SHTML

# activar SSI para tipos de archivo HTML y o SHTML
AddType text/html .html
AddType text/html .shtml
AddHandler server-parsed .html
AddHandler server-parsed .shtml
AddHandler server-parsed .htm

Da acceso CGI a un directorio concreto

# dar acceso CGI a un directorio concreto
Options +ExecCGI
AddHandler cgi-script cgi pl
# para activar todos los scripts de un directorio usa lo siguiente
SetHandler cgi-script

Desactiv a magic_quotes_gpc en servidores con PHP activo

# desconectar magic_quotes_gpc en servidores con PHP activo

php_flag magic_quotes_gpc off

Y hasta aquí. Espero que hayas aprendido mucho, y sino guarda este artículo en tus favoritos o donde acostumbres, para tenerlo de referencia futura.

Si se me ha pasado algo importante me lo comentas y lo incorporamos, así aprendemos todos.

AVISO: esta publicación es de hace dos años o más. If it's a code or a plugin it might not work in the latest versions of WordPress, and if it's a news story it might be obsolete. Luego no digas que no te hemos avisado.


Puede que también te ayude: