{"id":73,"date":"2015-05-18T13:03:23","date_gmt":"2015-05-18T12:03:23","guid":{"rendered":"http:\/\/tecnologiasweb.jsenso.es\/?p=73"},"modified":"2015-05-18T13:03:23","modified_gmt":"2015-05-18T12:03:23","slug":"el-fichero-htaccess","status":"publish","type":"post","link":"https:\/\/blogs.ugr.es\/tecweb\/el-fichero-htaccess\/","title":{"rendered":"La importancia del fichero .htaccess"},"content":{"rendered":"<p>Recientemente he publicado una entrada sobre <a href=\"http:\/\/tecnologiasweb.jsenso.es\/ya-he-instalado-drupal-y-ahora-que\/\" target=\"_blank\">qu\u00e9 hacer despu\u00e9s de instalar Drupal<\/a>. En ella hablo de que una de las primeras cosas deber\u00eda ser configurar correctamente el fichero .htaccess. Aprovecho ahora para <a href=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/asf_logo.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-277\" src=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/asf_logo.png\" alt=\"Logo de Apache\" width=\"220\" height=\"66\" \/><\/a>hablar con m\u00e1s detenimiento de ese fichero, que es fundamental dentro de cualquier servidor web, independientemente del software que lo mueva.<\/p>\n<p>El fichero <em>hypertext access<\/em>, m\u00e1s conocido como <a href=\"http:\/\/httpd.apache.org\/docs\/2.4\/howto\/htaccess.html\" target=\"_blank\">.htaccess<\/a>, es uno de los m\u00e1s importantes dentro de cualquier servidor web. A pesar de que fue dise\u00f1ado espec\u00edficamente para funcionar con servidores <a href=\"http:\/\/httpd.apache.org\/\" target=\"_blank\">Apache<\/a>, con el paso del tiempo su uso se ha generalizado en el resto de servidores web.<\/p>\n<p>En la mayor\u00eda de hosting que contratamos es imposible que nos den acceso al fichero del servidor, el famoso <em>httpd.conf<\/em>. Pero casi todas las acciones que se realizan con \u00e9l se pueden llevar a cabo con <em>.htaccess<\/em> de manera muy eficaz, ya que permite definir directivas de configuraci\u00f3n para cada directorio, y de los subdirectorios que de ah\u00ed cuelguen.<\/p>\n<p>El hecho de que se pueda contar con un fichero .htaccess en cada directorio del servidor tiene un efecto positivo: permitir controlar mejor el acceso y las directivas a aplicar dentro del contenido de dichos directorio. Pero tambi\u00e9n tiene un efecto negativo que debemos considerar: afecta a la velocidad del sitio. Cada vez que el cliente lanza una petici\u00f3n, lo primero que hace el servidor es verificar la existencia de este fichero, para aplicar o no sus directrices, lo que afecta directamente al rendimiento del sitio.<\/p>\n<p>Para que estos ficheros sean tenidos en cuenta por el servidor es necesario que la directiva <a href=\"http:\/\/httpd.apache.org\/docs\/trunk\/mod\/core.html#allowoverride\" target=\"_blank\">AllowOverride<\/a> est\u00e9 activada en el fichero <em>httpd.conf<\/em>.<\/p>\n<p>A continuaci\u00f3n hablaremos de tres elementos claves relacionados con este fichero:<\/p>\n<ul>\n<li><a href=\"#uso\">Usos concretos<\/a><\/li>\n<li><a href=\"#crear\">C\u00f3mo crearlo<\/a><\/li>\n<li><a href=\"#proteger\">C\u00f3mo protegerlo<\/a><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><b>Usos concretos del fichero .htaccess<a id=\"uso\"><\/a><\/b><\/h2>\n<p>Las posibilidades de configuraci\u00f3n que ofrece este fichero son inmensas. Tratar\u00e9 de comentar las m\u00e1s importantes:<\/p>\n<ul>\n<li><b>Autorizaci\u00f3n <\/b><b>y control de acceso<\/b>. El uso m\u00e1s com\u00fan se centra en emplear el fichero para especificar restricciones de acceso a un directorio (o varios) en concreto. Si no se posee la contrase\u00f1a no se permitir\u00e1 el acceso a la informaci\u00f3n que est\u00e1 almacenada en dicho directorio. El \u00fanico inconveniente que tiene realizar el control de acceso por este m\u00e9todo (tambi\u00e9n se podr\u00eda hacer a nivel de hosting o por medio del CMS) reside en que debe existir otro fichero, denominado .htpasswd, que almacene los nombres de usuario y las contrase\u00f1as. Esto limita en cierta medida la gesti\u00f3n de contrase\u00f1as (no se podr\u00eda \u201crecordar contrase\u00f1a\u201d, ni podr\u00eda ser cambiada por el usuario, s\u00f3lo por el administrador) y tiene alg\u00fan que otro problema relacionado con la seguridad. <a href=\"http:\/\/httpd.apache.org\/docs\/2.0\/es\/howto\/auth.html\" target=\"_blank\">En la web del servidor de Apache explican c\u00f3mo se debe realizar<\/a>.<\/li>\n<\/ul>\n<p><a href=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/2008326165746139.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-282\" src=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/2008326165746139.jpg\" alt=\"Mensaje de control de acceso\" width=\"326\" height=\"289\" \/><\/a><\/p>\n<ul>\n<li><b>Crear URLs amigables<\/b>. Aunque no est\u00e1 demostrado que contar con un URLs amigables suponga un beneficio directo a nivel SEO, es evidente que influye en la relaci\u00f3n entre lo que escribes y el usuario. Siempre le resultar\u00e1 m\u00e1s sencilla, comprensible y l\u00f3gica una URL amigable que otra llega de n\u00fameros y letras. Para que esto funcione es necesario que el m\u00f3dulo <a href=\"https:\/\/httpd.apache.org\/docs\/current\/mod\/mod_rewrite.html\" target=\"_blank\">mod_rewrite<\/a> de Apache est\u00e9 activado. Con estas l\u00edneas en el fichero .htacces deber\u00eda ser suficiente para que la cosa funcione:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">&lt;IfModule mod_rewrite.c&gt;\nRewriteEngine on\nRewriteBase \/\nRewriteCond %{SCRIPT_FILENAME} !-d\nRewriteCond %{SCRIPT_FILENAME} !-f\n&lt;\/IfModule&gt;<\/pre>\n<ul>\n<li><b>Limitar el acceso por IP<\/b>. Existen otras opciones de restringir el acceso al sitio, a un directorio o a un fichero empleando la IP del cliente que hace la petici\u00f3n. Este tipo de operaciones vienen muy bien cuando se est\u00e1n recibiendo muchos ataques de un mismo sitio, o cuando se quiere limitar el acceso a determinado contenido a un rango de IPs determinado. La orden:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">&lt;LIMIT GET&gt;\norder deny,allow\ndeny from 1.1.1.1\nallow from all\n&lt;\/LIMIT&gt;<\/pre>\n<p style=\"padding-left: 60px\">impide que pueda acceder la m\u00e1quina con la IP 1.1.1.1 y permite el acceso a todas las dem\u00e1s. La orden:<\/p>\n<pre style=\"padding-left: 90px\">&lt;Files index.php&gt;\nOrder Deny,Allow\nDeny from All\nAllow from 1.2.3.4\n&lt;\/Files&gt;<\/pre>\n<p style=\"padding-left: 60px\">Impide que la m\u00e1quina con el IP 1.2.3.4 pueda acceder al fichero index.php<\/p>\n<ul>\n<li><b>Control de la cach\u00e9<\/b>. Se emplea para gestionar la cach\u00e9 web del navegador y\/o proxie, reduciendo el consumo de ancho de banda. Se usa tambi\u00e9n para agilizar la comunicaci\u00f3n con el servidor y descargarlo de trabajo. Aunque este proceso tambi\u00e9n se puede gestionar desde el CMS, en ocasiones es ma\u015b efectivo hacerlo desde el htaccess. Por ejemplo, de esta manera se establecer\u00eda una semana como periodo de vigencia de las im\u00e1genes almacenadas en la cach\u00e9:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">&lt;FilesMatch \"\\.(jpg|jpeg|png|gif|swf)$\"&gt;\nHeader set Cache-Control \"max-age=604800, public\"\n&lt;\/FilesMatch&gt;<\/pre>\n<ul>\n<li><b>Obligar a usar una conexi\u00f3n segura<\/b>. Es muy \u00fatil si se tiene instalado un certificado SSL. De esta manera se obliga a todo el sitio a que se emplee este certificado. Los agentes de b\u00fasqueda, por ejemplo, se redirigir\u00e1n hacia ah\u00ed. Se hace por medio de:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">RewriteEngine On\nRewriteCond %{HTTPS} !on\nRewriteRule (.*) https:\/\/%{HTTP_HOST}%{REQUEST_URI}<\/pre>\n<ul>\n<li><b>Control de los tipos MIME<\/b>. Se emplea para controlar c\u00f3mo queremos que el servidor gestione los diferentes tipos de <a href=\"https:\/\/www.ietf.org\/rfc\/rfc2045.txt\" target=\"_blank\">formatos MIME<\/a>. De esta manera, por ejemplo, se puede evitar la descarga de ficheros para filtros y estilo del gestor bibliogr\u00e1fico <a href=\"http:\/\/www.endnote.com\/\" target=\"_blank\">Endnote<\/a>:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">AddType application\/x-endnote-style ens\nAddType application\/x-endnote-filter enf<\/pre>\n<ul>\n<li><b>Indicar la p\u00e1gina por defecto<\/b>. Aunque suele venir configurada en Apache, puede suceder que nos interese cambiar la p\u00e1gina principal por defecto. Para ello:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">DirectoryIndex welcome.html<\/pre>\n<ul>\n<li><b>P\u00e1gina de error 404<\/b>. El famoso error de que un archivo ya no existe. Es uno de los mayores generadores de penalizaciones SEO. Es posible configurar htaccess para que el sistema muestre una p\u00e1gina propia, en vez del t\u00edpico error: 404 URL not found.<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">ErrorDocument 404 \/error404.html<\/pre>\n<p style=\"padding-left: 60px\">Si se desea, se pueden personalizar el resto de p\u00e1ginas de error con 403\/error403.html; 401\/error401.html&#8230;<\/p>\n<p style=\"padding-left: 60px\"><a href=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/error-404-pressroom-de-hostalia-hosting1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter  wp-image-283\" src=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/error-404-pressroom-de-hostalia-hosting1.png\" alt=\"P\u00e1gina 404 personalizada\" width=\"532\" height=\"398\" \/><\/a><\/p>\n<ul>\n<li><b>P\u00e1gina de redirecci\u00f3n 301<\/b>. Se trata de redirigir de una p\u00e1gina a otra. Se hace as\u00ed:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">Redirect 301 \/index.html \/nuevo\/index.html<\/pre>\n<p style=\"padding-left: 60px\">Piensa que no es lo mismo la redirecci\u00f3n 301 (permanente) que la 302 (temporal). <a href=\"http:\/\/estelafranco.com\/seo\/redirecciones-301-302-htaccess.html\" target=\"_blank\">En este blog<\/a> se explica muy bien la diferencia.<\/p>\n<ul>\n<li><b>Redirigir a otro dominio<\/b>. Muy \u00fatil cuando est\u00e1s migrando el contenido de un servidor a otro y quieres mantener activos ambos para no sufrir penalizaciones SEO. Para ello:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">RewriteEngine onRewriteCond %{HTTP_HOST} ^www.web-antigua..com$ [OR]\nRewriteCond %{HTTP_HOST} ^web-antigua.com$\nRewriteRule ^\/?$ \"http:\/\/nueva-web.com\/\" [R=301,L]<\/pre>\n<ul>\n<li><b>URLS can\u00f3nicas<\/b>. El hecho de que una misma web sea accesible por medio de <a href=\"http:\/\/www\/\">http:\/\/www<\/a> y por http:\/\/ (sin el www) la convierte en dos webs diferentes desde el punto de vista SEO. Teniendo en cuenta que los buscadores suelen penalizar la copia de material, esto implicar\u00eda que se considera que una web plagia a la otra. Si tenemos el dominio <a href=\"http:\/\/www.hola.com\/\">www.hola.com<\/a> y queremos captar tanto a los usuarios que se dirijan a <a href=\"http:\/\/www.hola.com\/\">www.hola.com<\/a> como a los de hola.com, deber\u00edamos escribir esto:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">RewriteEngine onRewriteCond %{HTTP_HOST} ^www.hola.com$\nRewriteRule ^\/?$ \"http:\/\/hola.com\/\" [R=301,L]<\/pre>\n<p style=\"padding-left: 60px\">Efectivamente, se trata de una peque\u00f1a variaci\u00f3n de la redirecci\u00f3n 301 explicada anteriormente.<\/p>\n<ul>\n<li><b>Evitar el listado de ficheros<\/b>. De esa manera impedimos que alguien pueda acceder al nombre de todos los ficheros que existan dentro de una carpeta determinada. Es un mecanismo de seguridad muy necesario.<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">Options -IndexesIndexIgnore *<\/pre>\n<ul>\n<li><b>Limitar el tama\u00f1o m\u00e1ximo de los ficheros<\/b>. Para evitar que se puedan subir al servidor ficheros muy grandes y se consuma de esa manera el ancho de banda contratado. Es, junto al control de hotlink, el mejor sistema para gestionar el tr\u00e1fico, ya que tambi\u00e9n permite definir el tiempo m\u00e1ximo que permitimos que espere el servidor para la ejecuci\u00f3n de cualquier proceso:<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">php_value upload_max_filesize 10M\nphp_value max_execution_time 200\nphp_value max_input_time 200<\/pre>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<h2><b><a id=\"crear\"><\/a>C\u00f3mo crear el fichero .htaccess<\/b><\/h2>\n<p>El fichero .htaccess no es especial en cuanto a su forma de creaci\u00f3n. No se trata m\u00e1s que de un fichero de texto en modo ASCII que, simplemente, no tiene nombre. Al menos tal y como estamos acostumbrados a ver: nombre.extensi\u00f3n<\/p>\n<p>El hecho de que tenga un punto delante indica que se trata de un fichero invisible, que no ser\u00e1 visualizado si se genera un listado de ficheros de una carpeta concreta.<\/p>\n<p>Para crearlo bastar\u00e1 con un editor de textos (notepad, gedit&#8230;) y guardarlo como htaccess.txt<a href=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/Notepad.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignleft  wp-image-285\" src=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/Notepad.png\" alt=\"Notepad\" width=\"95\" height=\"95\" \/><\/a> Una vez hecho esto se puede subir al servidor v\u00eda FTP y all\u00ed se renombra a .htaccess Tambi\u00e9n existe la posibilidad de crearlo directamente desde el panel del hosting.<\/p>\n<p>Si lo prefieres, tambi\u00e9n puedes emplear cualquier plantilla de las muchas que hay en la Web para crearlo. No tendr\u00e1s m\u00e1s seleccionar del formulario las opciones que quieres configurar, darle a aplicar y listo. Entre las plantillas que m\u00e1s me gustan:<\/p>\n<ul>\n<li><a href=\"http:\/\/www.htaccessredirect.net\/\" target=\"_blank\">.htaccess Generator<\/a><\/li>\n<li><a href=\"http:\/\/approsto.com\/htaccess-generator\/\" target=\"_blank\">Htaccess generator<\/a><\/li>\n<li><a href=\"http:\/\/www.htaccesseditor.com\/es.shtml\">.htaccessEditor<\/a><\/li>\n<\/ul>\n<p>Y aqu\u00ed tienes un <a href=\"http:\/\/www.htaccesstools.com\/htpasswd-generator\/\" target=\"_blank\">generador de ficheros htpasswd<\/a>.<\/p>\n<h2><\/h2>\n<h2><b><a id=\"proteger\"><\/a>C\u00f3mo proteger el fichero .htaccess<\/b><\/h2>\n<p><a href=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/proteger-libro.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright  wp-image-286\" src=\"https:\/\/blogs.ugr.es\/tecweb\/wp-content\/uploads\/sites\/55\/2018\/10\/proteger-libro.png\" alt=\"Proteger htaccess\" width=\"104\" height=\"56\" \/><\/a>Creo que ya ha quedado suficientemente clara la potencia e importancia de este fichero. Por eso es fundamental protegerlo bien. Para ello puedes hacer varias cosas:<\/p>\n<ul>\n<li>Evitar el acceso externo a .<i>htaccess<\/i>. Dentro del mismo fichero debes escribir:# protege el archivo htaccess<\/li>\n<\/ul>\n<pre style=\"padding-left: 90px\">&lt;files .htaccess&gt;\norder allow,\ndenydeny from all\n&lt;\/files&gt;<\/pre>\n<p style=\"padding-left: 60px\">No vendr\u00eda mal que extendieras esta protecci\u00f3n al fichero <i>htpasswd<\/i><\/p>\n<ul>\n<li>Desde el cliente FTP asigna los privilegios 644 o RW-R\u2014R&#8211; para evitar que se pueda editar desde fuera del servidor.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<h2><b>Consejos de uso<\/b><\/h2>\n<ul>\n<li>Aunque ya lo he mencionado al principio, no abuses de estos ficheros. Si creas un fichero de estos en cada directorio tendr\u00e1s un servidor muy seguro, s\u00ed, pero tambi\u00e9n muy lento.<\/li>\n<li>Organiza la informaci\u00f3n dentro del .htaccess para que sea f\u00e1cil de gestionar. Si vas poniendo l\u00edneas a lo loco lo m\u00e1s normal es que, pasado un tiempo, no sepas ni lo que has escrito.<\/li>\n<li>Acost\u00fambrate a comentar (con #) todas las l\u00edneas que pongas o, al menos, los grupos de directrices. Te ser\u00e1 m\u00e1s sencillo entender lo que has escrito dentro de varios meses.<\/li>\n<li>La orden de un directorio afecta a todos los subdirectorios que est\u00e9n por debajo de \u00e9l. Ten cuidado con lo que haces.<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Recientemente he publicado una entrada sobre qu\u00e9 hacer despu\u00e9s de instalar Drupal. En ella hablo de que una de las primeras cosas deber\u00eda ser configurar correctamente el fichero .htaccess. Aprovecho ahora para hablar con m\u00e1s detenimiento de ese fichero, que es fundamental dentro de cualquier servidor web, independientemente del software que lo mueva. El fichero [&hellip;]<\/p>\n","protected":false},"author":65,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_genesis_hide_title":false,"_genesis_hide_breadcrumbs":false,"_genesis_hide_singular_image":false,"_genesis_hide_footer_widgets":false,"_genesis_custom_body_class":"","_genesis_custom_post_class":"","_genesis_layout":"","footnotes":""},"categories":[43],"tags":[40,41,42],"class_list":{"0":"post-73","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-software-de-clase","7":"tag-administrador-del-sitio","8":"tag-apache","9":"tag-servidores-web","10":"entry"},"_links":{"self":[{"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/posts\/73","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/users\/65"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/comments?post=73"}],"version-history":[{"count":0,"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/posts\/73\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/media?parent=73"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/categories?post=73"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.ugr.es\/tecweb\/wp-json\/wp\/v2\/tags?post=73"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}